假设我对中继第 3 方模块不感兴趣。 是否可以将标准 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
最佳答案
通常,您可以使用 run_in_executor 将一些同步代码转换为异步运行它。 .
请注意,以这种方式将同步代码转换为异步意味着它不会阻止事件循环和其他协程,但这并不总是意味着此类代码会比原始代码运行得更快。例如,如果您想将一些受 CPU 限制的 Python 代码转换为协程,只有在多个内核上的多个进程中运行它,您才会受益。但如果你转换一些网络I/O相关的python代码,使用线程就可以很好地实现并行化。
open()
用于处理已转换为协程的文件 using aiofiles 中的线程执行器模块。您可以查看模块的源代码并以相同的方式实现您自己的包装器。
要了解如何包装 urllib
,请查看 this answer 。它显示将同步 requests.get
转换为协程:urllib
的一切都相同。
关于python - 创建我自己的协程以与 asyncio 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48348789/