使用greenlets与同步代码进行异步集成。
greenletio的Python项目详细描述
格林莱蒂奥
这个项目允许同步和异步函数一起使用。
与其他基于执行器和线程或进程池的方法不同,
greenletio
允许同步函数像异步函数一样工作
无需创建昂贵的线程或进程。在
快速入门
安装
此软件包与pip
一起安装:
$ pip install greenletio
异步
async_
函数使同步函数可等待。在
此函数也可用作装饰器:
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
原语。在
目标是为中的所有块函数提供替换 标准库,以便编写为块的代码可以异步使用。在
当前实现的模块是socket
、ssl
、threading
,以及
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。在
- 项目
标签: