python - 创建我自己的协程以与 asyncio 一起使用

标签 python python-asyncio

假设我对中继第 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/

相关文章:

python - 训练文本语料库太大而无法加载到内存中

python - 具有非 ascii 列的 SQLAlchemy 映射表到类

python - 按 GroupBy 内容过滤 Pandas DataFrame

django - 如何在 Jupyter Notebook 中使用 django 3.0 ORM 而不触发异步上下文检查?

python - 为每个异步函数调用创建一个新的记录器,好主意与否?

python - 为什么在 python 中对 asyncio 服务器的多个请求的时间会增加?

python - 如何在 pycharms 交互式调试器中评估协程

python - 值错误: Unknown metric function when using custom metric in Keras

python - Asyncio 检测断开挂起

python - 在鼠标事件类之外读取或传递数据