协程多任务通常运行在同一进程的单线程环境中,但如果有要将多个基于asyncio
的协程运行在不同线程中的需求,可在主线程中使用asyncio.new_event_loop()
创建一个new_loop
,在子线程中使用asyncio.set_event_loop(new_loop)
为子线程设置其事件循环。
给出如下例子做参考:
import threading
import asyncio
def thread_loop_task(loop):
# 为子线程设置自己的事件循环
asyncio.set_event_loop(loop)
async def work_2():
while True:
print('work_2 on loop:%s' % id(loop))
await asyncio.sleep(2)
async def work_4():
while True:
print('work_4 on loop:%s' % id(loop))
await asyncio.sleep(4)
future = asyncio.gather(work_2(), work_4())
loop.run_until_complete(future)
if __name__ == '__main__':
# 创建一个事件循环thread_loop
thread_loop = asyncio.new_event_loop()
# 将thread_loop作为参数传递给子线程
t = threading.Thread(target=thread_loop_task, args=(thread_loop,))
t.daemon = True
t.start()
main_loop = asyncio.get_event_loop()
async def main_work():
while True:
print('main on loop:%s' % id(main_loop))
await asyncio.sleep(4)
main_loop.run_until_complete(main_work())
运行结果
work_2 on loop:140457065774384
work_4 on loop:140457065774384
main on loop:140457010489888
work_2 on loop:140457065774384
main on loop:140457010489888
work_4 on loop:140457065774384
work_2 on loop:140457065774384
work_2 on loop:140457065774384
main on loop:140457010489888
work_4 on loop:140457065774384
work_2 on loop:140457065774384
work_2 on loop:140457065774384
work_4 on loop:140457065774384
main on loop:140457010489888
work_2 on loop:140457065774384
work_2 on loop:140457065774384
work_4 on loop:140457065774384
main on loop:140457010489888
work_2 on loop:140457065774384
work_2 on loop:140457065774384
work_4 on loop:140457065774384
main on loop:140457010489888
work_2 on loop:140457065774384
work_2 on loop:140457065774384
可以看出主线程和子线程的协程分别运行在不同的时间循环中, 且运行正常
参考文档:
https://www.jianshu.com/p/b5e347b3a17c
https://segmentfault.com/a/1190000008814676
https://docs.python.org/3/library/asyncio-eventloops.html?highlight=get_event_loop#event-loop-policy-interface