是否可以在后台启动异步事件循环而不生成线程或进程?

Ago*_*iro 5 python-3.x python-asyncio

我有一个用 Python 3.5 实现的服务,它应该定期通过网络加载文件。我想避免在加载时阻塞主线程。为了避免向我的应用程序引入线程和共享内存的复杂性,我想使用带有 asyncio 包的事件循环来对此进行检测。

为了运行事件循环,我找到了AbstractEventLoop.run_forever()AbstractEventLoop.run_until_complete(future)方法,但两者在调用时似乎都会阻塞主线程。我发现避免这种情况的唯一方法是在不同的线程中启动循环。但是如果我无论如何都使用线程,那么使用事件循环就没有意义了。

所以我的问题是:是否可以在后台启动异步事件循环而不生成线程或进程?

Yuv*_*uss 2

您可以使用该run_in_executor方法。使用此方法运行的每个函数都在自己的线程中运行(并行)。

AbstractEventLoop.run_in_executor() 方法可以与线程池执行器一起使用,在不同的线程中执行回调,以免阻塞事件循环的线程。

executor 参数应该是一个 Executor 实例。如果执行器为 None,则使用默认执行器。

例如:

import asyncio

def load_file_over_network(file_name):
    # do the file loading
    pass

loop = asyncio.get_event_loop()
file_name = 'FILE_NAME'

# load the file without blocking
loop.run_in_executor(None, load_file_over_network, file_name)

# do some other stuff in the main thread
# while the synchronous code above is running in other threads, the event loop
# can go do other things

# load the file again without blocking
loop.run_in_executor(None, load_file_over_network, file_name)
Run Code Online (Sandbox Code Playgroud)

希望这有帮助:)