1 回答
TA贡献1802条经验 获得超5个赞
这种方法总体上很好。你有一些问题:
(1)几乎所有的asyncio对象都不是线程安全的
(2) 您的代码本身不是线程安全的。如果任务出现在之后needed_tasks = _tasks.copy()
但之前怎么办_tasks = []
?这里需要一把锁。顺便说一句,复制是没有意义的。简单needed_tasks = _tasks
就行了。
(3) 一些 asyncio 结构是线程安全的。使用它们:
import threading
import asyncio
# asyncio.get_event_loop() creates a new loop per thread. Keep
# a single reference to the main loop. You can even try
# _loop = asyncio.new_event_loop()
_loop = asyncio.get_event_loop()
def get_app_loop():
return _loop
def asyncio_thread():
loop = get_app_loop()
asyncio.set_event_loop(loop)
loop.run_forever()
def add_asyncio_task(task):
asyncio.run_coroutine_threadsafe(task, get_app_loop())
def start_asyncio_loop():
t = threading.Thread(target=asyncio_thread)
t.start()
添加回答
举报