能否使用Python3的asyncio
包与Boost.Python
库一起使用?
我有一个使用Boost.Python
构建的C++
扩展。用C++
编写的函数可能需要很长时间才能运行。我想使用asyncio
调用这些函数,但是res = await cpp_function()
代码无法工作。
cpp_function
在协程内部调用时会发生什么?- 如何避免因调用长时间运行的
C++
函数而被阻塞?
注意:C++
没有进行某些I/O操作,只是计算。
能否使用Python3的asyncio
包与Boost.Python
库一起使用?
我有一个使用Boost.Python
构建的C++
扩展。用C++
编写的函数可能需要很长时间才能运行。我想使用asyncio
调用这些函数,但是res = await cpp_function()
代码无法工作。
cpp_function
在协程内部调用时会发生什么?C++
函数而被阻塞?注意:C++
没有进行某些I/O操作,只是计算。
run_in_executor
返回可等待的协程。ProcessPoolExecutor
(我不确定ThreadPoolExecutor
是否适合您的情况,但建议您进行检查)。import asyncio
from concurrent.futures import ProcessPoolExecutor
import time
def blocking_function():
# Function with long-running C/Python code.
time.sleep(3)
return True
async def main():
# Await of executing in other process,
# it doesn't block your event loop:
loop = asyncio.get_event_loop()
res = await loop.run_in_executor(executor, blocking_function)
if __name__ == '__main__':
executor = ProcessPoolExecutor(max_workers=1) # Prepare your executor somewhere.
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
max_workers
定义为1
,并且为什么使用ProcessPoolThreads
吗?因为Python文档中说线程用于I/O操作,而进程用于CPU工作。在我的案例中,协程调用了cpp_function只是从另一个字符串中获取一个字符串。这个cpp_function可能会占用所有的CPU资源,那么使用任何asyncio都没有意义。在我的情况下,asyncio(和Executors)有什么好处呢? - Illia AnanichProcessPoolExecutor
。但是验证我的想法很容易:尝试将ThreadPoolExecutor
用于cpp_function
并同时运行一些简单的任务(它可以每秒打印一些内容)。如果在执行cpp_function
时这个任务被冻结了,那么线程就不是一个选项。 - Mikhail GerasimovTypeError: can't pickle Boost.Python.function objects
。 - Illia Ananich