首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建我自己的用于异步的协同服务

创建我自己的用于异步的协同服务
EN

Stack Overflow用户
提问于 2018-01-19 20:11:08
回答 1查看 232关注 0票数 1

假设我对第三方模块不感兴趣。是否有可能将一个标准python模块封装到一个coroutine中以便与asyncio一起使用?

例如:

  • open()封装到协同线中以读取/写入文件
  • urllib封装到协同线中,以发出非阻塞请求

就像这样:

代码语言:javascript
复制
@asyncio.coroutine
def async_open(filename: str, mode: str) -> str:
    with open(filename, mode) as fopen:
        for block in fopen:
            yield block
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-20 08:23:20

通常,您可以使用遗嘱执行人转换一些同步代码来异步运行它。

请注意,以这种方式将同步代码转换为异步代码意味着它不会阻止事件循环和其他协同,但这并不总是意味着此类代码的运行速度将比原始代码快。例如,如果您想将某些与CPU绑定的python代码转换为coroutine,那么只有在多个核上运行多个进程时才能得到好处。但是,如果您转换了一些与网络I/O相关的python代码,那么使用线程就可以实现并行化。

open()来处理已经抛出到教友模块中的协同线程执行器的文件。您可以查看模块的源代码,并以同样的方式实现自己的包装器。

要了解如何包装urllib,请看一下这个答案。它显示了将同步requests.get转换为coroutine:对于urllib来说一切都是一样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48348789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档