Deutsch English Français Italiano |
<mailman.19.1711200353.3468.python-list@python.org> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!fu-berlin.de!uni-berlin.de!not-for-mail From: Frank Millman <frank@chagford.com> Newsgroups: comp.lang.python Subject: Re: Using a background thread with asyncio/futures with flask Date: Sat, 23 Mar 2024 15:25:28 +0200 Lines: 118 Message-ID: <mailman.19.1711200353.3468.python-list@python.org> References: <8a7231df-c30c-4fa6-9daa-546b3453b547@thomasnyberg.com> <09efe843-195e-48c0-a9cb-6fe05e3a6921@solute.de> <dcdef19d-cca1-4ce3-af8d-ae79abf79ec8@thomasnyberg.com> <1322c7e8-2153-400d-afc5-7f2993031c08@chagford.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Trace: news.uni-berlin.de CTBQcfEXdE/m44XZkGly8AAkciLr1VM4xJ+uovIgO11A== Cancel-Lock: sha1:LMkA/Dl3GXVv1NQw/WJaz/BwCbs= sha256:bvuIStMNy/waLtB784d/dAKL8p7btd5Kxe2Db/gMFgk= Return-Path: <frank@chagford.com> X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org Authentication-Results: mail.python.org; dkim=pass reason="2048-bit key; unprotected key" header.d=chagford.com header.i=@chagford.com header.b=jyhL40kV; dkim-adsp=pass; dkim-atps=neutral X-Spam-Status: OK 0.008 X-Spam-Evidence: '*H*': 0.98; '*S*': 0.00; 'def': 0.04; 'loop': 0.07; 'queue': 0.07; 'import': 0.15; '(after': 0.16; '(when': 0.16; 'exhibits': 0.16; 'from:addr:chagford.com': 0.16; 'from:addr:frank': 0.16; 'from:name:frank millman': 0.16; 'message-id:@chagford.com': 0.16; 'received:196.35': 0.16; 'received:196.35.198': 0.16; 'received:197.90': 0.16; 'received:197.90.32': 0.16; 'received:197.90.32.26': 0.16; 'received:synaq.com': 0.16; 'subject:thread': 0.16; 'thread.': 0.16; 'threading': 0.16; 'wrote:': 0.16; 'pm,': 0.19; 'to:addr :python-list': 0.20; 'version': 0.23; 'install': 0.23; 'installed': 0.23; 'run': 0.23; 'flask': 0.26; 'library': 0.26; 'printed': 0.28; 'header:User-Agent:1': 0.30; 'passes': 0.32; 'python-list': 0.32; 'skip:= 50': 0.32; 'subject:Using': 0.32; 'but': 0.32; 'same': 0.34; 'header:In-Reply-To:1': 0.34; 'following': 0.35; 'using': 0.37; 'put': 0.38; 'reference': 0.60; 'skip:o 10': 0.61; 'skip:\xc2 10': 0.62; 'skip:i 20': 0.62; 'here': 0.62; 'skip:o 20': 0.63; 'skip:t 40': 0.64; 'skip:t 30': 0.67; 'await': 0.69; 'received:196': 0.69; 'skip:a 40': 0.70; 'skip:f 30': 0.71; 'future': 0.72; '8bit%:100': 0.76; 'true:': 0.84 ARC-Seal: i=1; cv=none; a=rsa-sha256; d=synaq.com; s=securemail; t=1711200350; b=fT59NkUhmMcABKEOf2SJcZ/havxP+ZX6WzWlyRIPfhwy5TDo3NUNurilCCs0xIVzxq8iGWKhL7 dYIQ/wotiUC4aObTzPcreaaw3dOGxAutgsVzu/LkxxsBxLFpX9uzHspiT7XHkKfyCdzYEmJD1W VMVih0ZUef/CQViEImz8UaGV5sZ6Av63q/4WFKysfrc+DOQs009673WPJ8wRo5OQ/cJlK3ohEh mVJlK/FX7V3j4yBifwtlneSNKZX3zUEaxR3AbckItnwM1lKdqelgCHLGFsC7zrUVw9gl1OmVGQ 0IVWcNXNKECYZQsWaX3kCW2mjDyvXvcpvZMjdgF2fpAc1Q==; ARC-Authentication-Results: i=1; synaq.com; iprev=fail smtp.remote-ip=197.90.32.26; auth=pass (PLAIN) smtp.auth=frank@chagford.com; arc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed; d=synaq.com; s=securemail; t=1711200350; bh=CvzCFWrSXCuaD3LdeDzsdUyQhmOkoTLXPDGJMWN3asM=; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:From:References:To: Subject:MIME-Version:Date:Message-ID:DKIM-Signature; b=HLArU9jlH4A3tjCfazvsJzqnm84cuHO/FHUytOwYawEKHsQ1o46AhqZtun6ugzJZqF2aPV3DuX vXceD5Z0EhEXEEnHudH71ilTmyACcA9/22avyqfERDbBuh6vgPeQe6SpBLvNEbK6YV6hX13QO1 AvePa2Et334pwJnZbxdyZAqvFukuVzqGNhRPnwI3kQ5a8KfVT9930qt1TlT8hqMONY4awvOqrn tT6c4EMwkFs8RuJLGGyVCOCUl86dDszt5vlxiV0BlgBqApQ0xmew5l8rToccltjFHllejGVQ3W BXpw/2mMiDBvT4ZZuLzHn3L06OnE1tlA2KGXOSrjSXd43A==; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=chagford.com; s=securemail; h=In-Reply-To:From:To:Date:Message-ID; bh=OKUrUV1m7f3Dq7UEcNqgmpO7pZIsv1R+oPQmL4Qzl6c=; b=jyhL40kVcHNdcoYSDerB0Tmwa3 tus937lkD2vHF7HBY+v4pgo2TfAzCBcInUmm1EVknw00zU0sO+l7bvHztkKBIokbdAfSaqYA9+ZJi aTlNdc2NVjucXmTQl5URl9j5RR8QyFOXW/DyOEo0eK6KnvEUlZrZ5gNloDW0lf5UiURhOyKiezo6d AW1ZE/IbjQVEy7JdbeNdY3jdRui56J/AjAlpeFxsUa22EUFuxWUj3eM0ItlAyOvALbRXVzyO8KiQK jzybn5fzbPQS3VmEScvWra/TpU5fj+/7H5agztZPKibyy+lxUMoXHa94uYcs0uyohfhQRrrZ1NAQv NYLQmhHg==; Authentication-Results: synaq.com; iprev=fail smtp.remote-ip=197.90.32.26; auth=pass (PLAIN) smtp.auth=frank@chagford.com; arc=none User-Agent: Mozilla Thunderbird Content-Language: en-US In-Reply-To: <dcdef19d-cca1-4ce3-af8d-ae79abf79ec8@thomasnyberg.com> X-Red-Router: yes X-SYNAQ-Pinpoint-Information: Please contact SYNAQ for more information X-SYNAQ-Pinpoint-ID: 1ro1NX-0000I0-6V X-SYNAQ-Pinpoint: No virus infections found X-Pinpoint-From: frank@chagford.com X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.39 Precedence: list List-Id: General discussion list for the Python programming language <python-list.python.org> List-Unsubscribe: <https://mail.python.org/mailman/options/python-list>, <mailto:python-list-request@python.org?subject=unsubscribe> List-Archive: <https://mail.python.org/pipermail/python-list/> List-Post: <mailto:python-list@python.org> List-Help: <mailto:python-list-request@python.org?subject=help> List-Subscribe: <https://mail.python.org/mailman/listinfo/python-list>, <mailto:python-list-request@python.org?subject=subscribe> X-Mailman-Original-Message-ID: <1322c7e8-2153-400d-afc5-7f2993031c08@chagford.com> X-Mailman-Original-References: <8a7231df-c30c-4fa6-9daa-546b3453b547@thomasnyberg.com> <09efe843-195e-48c0-a9cb-6fe05e3a6921@solute.de> <dcdef19d-cca1-4ce3-af8d-ae79abf79ec8@thomasnyberg.com> Bytes: 8727 On 2024-03-22 12:08 PM, Thomas Nyberg via Python-list wrote: > Hi, > > Yeah so flask does support async (when installed with `pip3 install > flask[async]), but you are making a good point that flask in this case > is a distraction. Here's an example using just the standard library that > exhibits the same issue: > > `app.py` > ``` > import asyncio > import threading > import time > from queue import Queue > > > in_queue = Queue() > out_queue = Queue() > > > def worker(): > print("worker started running") > while True: > future = in_queue.get() > print(f"worker got future: {future}") > time.sleep(5) > print("worker sleeped") > out_queue.put(future) > > > def finalizer(): > print("finalizer started running") > while True: > future = out_queue.get() > print(f"finalizer got future: {future}") > future.set_result("completed") > print("finalizer set result") > > > threading.Thread(target=worker).start() > threading.Thread(target=finalizer).start() > > > async def main(): > future = asyncio.get_event_loop().create_future() > in_queue.put(future) > print(f"main put future: {future}") > result = await future > print(result) > > > if __name__ == "__main__": > loop = asyncio.get_event_loop() > loop.run_until_complete(main()) > ``` > > If I run that I see the following printed out (after which is just hangs): > > ``` Combining Dieter's and Mark's ideas, here is a version that works. It is not pretty! call_soon_threadsafe() is a loop function, but the loop is not accessible from a different thread. Therefore I include a reference to the loop in the message passed to in_queue, which in turn passes it to out_queue. Frank ======================================================= import asyncio import threading import time from queue import Queue in_queue = Queue() out_queue = Queue() def worker(): print("worker started running") while True: loop, future = in_queue.get() print(f"worker got future: {future}") time.sleep(5) print("worker sleeped") out_queue.put((loop, future)) def finalizer(): print("finalizer started running") while True: loop, future = out_queue.get() print(f"finalizer got future: {future}") loop.call_soon_threadsafe(future.set_result, "completed") print("finalizer set result") ========== REMAINDER OF ARTICLE TRUNCATED ==========