让我们说我对转发第三方模块不感兴趣。
是否可以将标准python模块包装到协程中以便与asyncio
一起使用?
例如:
open()
包装到协程中以读取/写入文件urllib
包装到协程中以进行非阻止请求类似的东西:
@asyncio.coroutine
def async_open(filename: str, mode: str) -> str:
with open(filename, mode) as fopen:
for block in fopen:
yield block
答案 0 :(得分:1)
通常,您可以使用run_in_executor将某些同步代码转换为异步运行异步代码。
注意,以这种方式将同步代码转换为异步意味着它不会阻止事件循环和其他协同程序,但它并不总是意味着这样的代码运行速度会比原始代码快。例如,如果你想将一些CPU绑定的python代码转换为协同程序,那么只有在多个核心上的多个进程中运行它时才会受益。但是如果你构建了一些与网络I / O相关的python代码,那么使用线程可以很好地实现并行化。
open()
使用已经转换为using模块中的coroutine aiofiles线程执行程序的文件。您可以查看模块的源代码并以相同的方式实现自己的包装器。
要了解如何包装urllib
,请查看this answer。它显示了与协同程序的同步requests.get
:urllib
的所有内容都相同。