annotate blender/asyncio_thread.py @ 2454:405abed9a45c default tip

fix up asyncio-in-bg-thread sorcery
author drewp@bigasterisk.com
date Mon, 19 May 2025 21:25:32 -0700
parents b23afde50bc2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
1 import asyncio
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
2 import sys
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
3 from threading import Thread, get_ident
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
4 import time
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
5 from typing import Coroutine
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
6
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
7
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
8 def log(msg):
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
9 try:
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
10 rl = hex(id(asyncio.get_running_loop()))
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
11 except RuntimeError:
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
12 rl = '(no loop ----)'
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
13 sys.stderr.write(f"thread={hex(get_ident())} loop={rl} {msg}\n")
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
14
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
15
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
16 def startLoopInThread(task: Coroutine) -> asyncio.AbstractEventLoop:
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
17 """
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
18 run a new event loop in a background thread. `task` is run in the new loop.
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
19 Caller should use this (from fg thread) to run further tasks:
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
20 asyncio.run_coroutine_threadsafe(task, returned_loop)
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
21
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
22 """
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
23 log('🚋4 startLoopInThread enter ')
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
24 loops = []
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
25
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
26 def start_background_loop() -> None:
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
27
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
28 async def forever():
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
29 log('🚋6 log_loop')
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
30 loops.append(asyncio.get_running_loop())
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
31 while True:
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
32 await asyncio.sleep(100)
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
33
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
34 log('🚋5 make asyncio loop')
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
35 asyncio.run(forever())
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
36 log('🚋19 start_background_loop done')
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
37
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
38 t = Thread(target=start_background_loop, daemon=True)
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
39 t.start()
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
40 while not loops:
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
41 time.sleep(.1)
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
42 loop = loops[0]
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
43 log('🚋7 loop has started in thread')
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
44
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
45 asyncio.run_coroutine_threadsafe(task, loop)
2454
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
46 log('🚋8 started task')
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
47
405abed9a45c fix up asyncio-in-bg-thread sorcery
drewp@bigasterisk.com
parents: 2453
diff changeset
48 log('🚋9 startLoopInThread exit')
2432
b8a408caf115 start blender sync
drewp@bigasterisk.com
parents:
diff changeset
49 return loop