创建我自己的协程以与 asyncio 一起使用
Create my own Coroutines to use with asyncio
假设我对中继第 3 方模块不感兴趣。
是否可以将标准 python 模块包装到协程中以便与 asyncio
一起使用?
例如:
- 将
open()
包装到 read/write 个文件的协程中
- 将
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()
处理已经转换为协程 threads executor in aiofiles 模块的文件。您可以查看模块的源代码并以相同的方式实现您自己的包装器。
要了解如何包装 urllib
,请查看 this answer。它显示将同步 requests.get
强制转换为协程:urllib
.
的一切都相同
假设我对中继第 3 方模块不感兴趣。
是否可以将标准 python 模块包装到协程中以便与 asyncio
一起使用?
例如:
- 将
open()
包装到 read/write 个文件的协程中 - 将
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()
处理已经转换为协程
要了解如何包装 urllib
,请查看 this answer。它显示将同步 requests.get
强制转换为协程:urllib
.