使用greenlets与同步代码进行异步集成。

greenletio的Python项目详细描述


格林莱蒂奥

Build Status

这个项目允许同步和异步函数一起使用。 与其他基于执行器和线程或进程池的方法不同, greenletio允许同步函数像异步函数一样工作 无需创建昂贵的线程或进程。在

快速入门

安装

此软件包与pip一起安装:

$ pip install greenletio

异步

async_函数使同步函数可等待。在

^{pr2}$

此函数也可用作装饰器:

importasynciofromgreenletioimportasync_@async_defsync_function(arg):passasyncdefasync_function():awaitsync_function(42)asyncio.run(async_function())

等待

await_函数可用于等待 不阻塞异步循环的同步模式:

fromgreenletioimportawait_asyncdefasync_function():passdefsync_function():await_(async_function())

有时,使用await_作为装饰器来生成 可从同步代码调用的异步函数(再次,没有 阻塞循环):

fromgreenletioimportawait_@await_asyncdefasync_function():passdefsync_function():async_function()

注意,异步应用程序中使用的同步函数必须遵循 应用于异步函数的有关不调用任何 封锁代码。在

繁殖

spawn函数以异步方式启动同步Python函数 青菜。新的greenlet(以及从它调用的任何函数)可以使用 await_函数。在

绿色。*

greenletio.green下的模块是Python的直接替换 使用async_实现的同名标准库模块, await_spawn原语。在

目标是为中的所有块函数提供替换 标准库,以便编写为块的代码可以异步使用。在

当前实现的模块是socketsslthreading,以及 time。在

补丁堵塞

patch_blocking上下文管理器可用于导入为 所有阻塞函数重定向到的Python标准库 他们的green.*替代品。在

补丁程序psycopg2

patch_psycopg2函数将psycopg2配置为访问Postgres数据库 在非阻塞模式下。在

为什么?在

将应用程序移植到asyncio通常非常复杂,因为 由于“病毒性”需要转换代码库的很大一部分 异步代码,它只需要一个异步函数调用 另一个异步函数。在

这个包提供了一个解决方案,允许同步和异步代码 在不阻塞异步循环的情况下互相调用。在

这怎么可能?在

greenletio将异步函数与 greenlets去实现什么不是 可以使用独立的Python。在

greenlet提供了一种上下文切换或从中间“跳转”的方法 运行另一个函数,然后在原来的位置恢复第一个 打断。在

这为同步函数“逃离”阻塞打开了可能性 wait by context切换到释放CPU的异步函数 回到循环。中断的功能只有在 阻塞条件已解决。在

以前的工作

greenletio的想法源于 proof-of-concept gist 使用greenlets防止同步代码阻塞。 其目的是使用这种技术来允许SQLAlchemy在 异步应用程序。在

自从Mike的代码公开后,我们得知另一个项目 具有相同目标的协同计划和绿色小菜 greenback,作者:约书亚·奥勒曼。在

greenletio的总体设计基于eventlet。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何修改打印板?   java Spring批处理JdbcCursorItemReader还是RepositoryItemReader?   java如何在JTable Swing中增加标题列的字体?   java在数组方面遇到问题,导致表达式非法启动   java如何为maven pom的某些部分关闭Eclipse代码格式化程序。xml   java Dropwizard登录代码   java Jersey 2.22:客户端的默认连接超时是多少?   java无法自动连接字段:javax。sql。数据来源   如何从java中的行列表中获取单词列表?   java JDBC批量更新和处理异常?   计算大根:bigdecimal/java   java如何在JavaCC语法中提到trycatch块   javasocket。getInetAddress()不返回任何内容   oracle SQL开发人员错误无法找到Java虚拟机   java我如何计算和显示未来5年每一年的投资价值   java如何关闭浏览器选项卡?   java如何在showMessageDialog中打印双2D数组?   java从站点抓取播放列表URL?   selenium中的java点击css按钮