假设我对第三方模块不感兴趣。是否有可能将一个标准python模块封装到一个coroutine中以便与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发布于 2018-01-20 08:23:20
通常,您可以使用遗嘱执行人转换一些同步代码来异步运行它。
请注意,以这种方式将同步代码转换为异步代码意味着它不会阻止事件循环和其他协同,但这并不总是意味着此类代码的运行速度将比原始代码快。例如,如果您想将某些与CPU绑定的python代码转换为coroutine,那么只有在多个核上运行多个进程时才能得到好处。但是,如果您转换了一些与网络I/O相关的python代码,那么使用线程就可以实现并行化。
open()来处理已经抛出到教友模块中的协同线程执行器的文件。您可以查看模块的源代码,并以同样的方式实现自己的包装器。
要了解如何包装urllib,请看一下这个答案。它显示了将同步requests.get转换为coroutine:对于urllib来说一切都是一样的。
https://stackoverflow.com/questions/48348789
复制相似问题