如何在不干扰其他呼叫者的情况下在库中使用asyncio?

时间:2015-09-02 06:08:14

标签: python python-asyncio

我想编写一个使用asyncio管理子进程的库。我不想强迫我的调用者自己异步,所以我更愿意获得new_event_looprun_until_complete,然后close。理想情况下,我想这样做而不会与调用者可能正在做的任何其他asyncio内容冲突。

我的问题是等待子进程不起作用,除非你调用附加内部观察者的set_event_loop。但是当然如果我这样做,我可能会与调用者中的其他事件循环冲突。解决方法是缓存调用方的当前循环(如果有),然后在我完成恢复调用方状态时再次调用set_event_loop。这几乎可行。但是如果调用者不是asyncio用户,调用get_event_loop的副作用是我现在创建了一个以前不存在的全局循环,如果程序退出而没有调用,Python将打印一个可怕的警告该循环上的close

我能想到的唯一元解决方法是执行一个关闭全局循环的atexit.register回调。这不会与调用者冲突,因为close可以安全地多次调用,除非调用者做了一些疯狂的事情,比如在退出期间尝试启动全局循环。所以它仍然不完美。

这是否有完美的解决方案?

1 个答案:

答案 0 :(得分:2)

您尝试实现的目标与ProcessPoolExecutorconcurrent.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()