Ago*_*iro 5 python-3.x python-asyncio
我有一个用 Python 3.5 实现的服务,它应该定期通过网络加载文件。我想避免在加载时阻塞主线程。为了避免向我的应用程序引入线程和共享内存的复杂性,我想使用带有 asyncio 包的事件循环来对此进行检测。
为了运行事件循环,我找到了AbstractEventLoop.run_forever()和AbstractEventLoop.run_until_complete(future)方法,但两者在调用时似乎都会阻塞主线程。我发现避免这种情况的唯一方法是在不同的线程中启动循环。但是如果我无论如何都使用线程,那么使用事件循环就没有意义了。
所以我的问题是:是否可以在后台启动异步事件循环而不生成线程或进程?
您可以使用该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)
希望这有帮助:)
| 归档时间: |
|
| 查看次数: |
6269 次 |
| 最近记录: |