我想编写一个使用asyncio管理子进程的库。我不想强迫我的调用者自己异步,所以我更愿意获得new_event_loop
,run_until_complete
,然后close
。理想情况下,我想这样做而不会与调用者可能正在做的任何其他asyncio内容冲突。
我的问题是等待子进程不起作用,除非你调用附加内部观察者的set_event_loop
。但是当然如果我这样做,我可能会与调用者中的其他事件循环冲突。解决方法是缓存调用方的当前循环(如果有),然后在我完成恢复调用方状态时再次调用set_event_loop
。这几乎可行。但是如果调用者不是asyncio用户,调用get_event_loop
的副作用是我现在创建了一个以前不存在的全局循环,如果程序退出而没有调用,Python将打印一个可怕的警告该循环上的close
。
我能想到的唯一元解决方法是执行一个关闭全局循环的atexit.register
回调。这不会与调用者冲突,因为close可以安全地多次调用,除非调用者做了一些疯狂的事情,比如在退出期间尝试启动全局循环。所以它仍然不完美。
这是否有完美的解决方案?
答案 0 :(得分:2)
您尝试实现的目标与ProcessPoolExecutor(concurrent.futures)非常相似。
异步来电者:
@coroutine
def in_process(callback, *args, executor=ProcessPoolExecutor()):
loop = get_event_loop()
result = yield from loop.run_in_executor(executor, callback, *args)
return result
同步来电者:
with ProcessPoolExecutor() as executor:
future = executor.submit(callback, *args)
result = future.result()