方案1 使用os.fork 仅适用于Unix
在进程之间共享一个字典,它保存每个进程ID和事件循环实例。
import asyncio
import os
pid_loops = {}
def get_event_loop():
return pid_loops[os.getpid()]
def asyncio_init():
pid = os.getpid()
if pid not in pid_loops:
pid_loops[pid] = asyncio.get_event_loop()
pid_loops[pid].pid = pid
if __name__ == '__main__':
# 这里创建了一个子进程,并且父子进程,都会创建一个event loop
os.register_at_fork(after_in_parent=asyncio_init, after_in_child=asyncio_init)
# 通过os.fork()的返回值,来判断是父进程还是子进程
if os.fork() == 0:
# 在子进程中,获取event loop
loop = get_event_loop()
pid = os.getpid()
print('os pid:', pid, 'loop pid:', loop.pid)
else:
# 在父进程中,获取event loop
loop = get_event_loop()
pid = os.getpid()