协程多任务通常运行在同一进程的单线程环境中,但如果有要将多个基于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
可以看出主线程和子线程的协程分别运行在不同的时间循环中, 且运行正常