其实简单的不得了. 弄个线程,在线程里运行一个新的事件循环. 然后调用 run_coroutine_threadsafe 即可.
asyncio基础 : python 异步 asyncio
asyncio.get_event_loop() 默认是主线程的事件循环
每个线程一个事件循环 , 默认情况select循环
下面给出实现:
mport asyncio
#线程
def thread_running_loop(lp:asyncio.AbstractEventLoop):
print('loop running')
asyncio.set_event_loop(lp) #在此线程中设置一个新的事件循环,默认情况下事件循环是主线程的
lp.run_forever() #一直运行
#随意的一个协程
async def xxx(arg):
print('ready to work arg:' , arg)
await asyncio.sleep(1)
print('done ', arg)
#创建一个新的事件循环给子线程
newlp = asyncio.new_event_loop()
t = threading.Thread(target=thread_running_loop,args=(newlp,))
t.start()
#添加5个协程. 并指定事件循环 (第2个参数)
for i in range(5):
asyncio.run_coroutine_threadsafe(xxx(i),newlp)
t.join()
关闭 另一个线程的事件循环: