从异步代码中调用同步Python,不阻塞
项目描述
aevent 允许您从异步代码调用无聊的同步Python。不阻塞或将 async 和 await 撕裂到它上面。理想情况下,这不需要修改同步代码。
换句话说,aevent 对 gevent 来说就像 anyio 对 greenlet 一样。
也就是说,它用 anyio 的调用替换了标准Python函数,而不是 gevent。
适用一些限制。
用法
在任何其他导入之前,将此代码块插入到您的主代码中
import aevent aevent.setup('trio') # or asyncio, if you must
这会让各种代码检查器感到烦恼,但这是不可避免的。
使用 aevent.run 启动主循环,或在需要使用修补代码的任务(s)中调用 await aevent.per_task()。
可以使用 aevent.native 和 aevent.patched 上下文管理器暂时禁用或重新启用 aevent 的修补。
支持函数
aevent 以两种方式猴子补丁 anyio 的 TaskGroup.spawn。
子任务被仪器化以支持 greenback。
spawn 返回一个取消范围。您可以使用它来取消新任务。
如果您以其他方式启动任务,请在子任务中调用 aevent.per_task。
线程
线程被转换为任务。为了使其正常工作,您必须以 aevent.run 启动程序,或者在一个 aevent.runner 异步上下文中运行相关的同步代码。运行器可以嵌套。
支持的模块
time
sleep
threading
queue
atexit
socket
select
poll
尚未支持
select
其他内容
dns
os
read
write
ssl
subprocess
signal
子类化修补的类
直接从 aevent 修补的类中派生并不起作用,需要特殊考虑。考虑以下代码
class my_thread(threading.Thread): def run(self): ...
与 aevent 一起使用时,您可以选择原始的 Thread 实现
orig_Thread = getattr(threading.Thread, "_aevent_orig", threading.Thread) class my_thread(orig_Thread): ...
或 aevent-化的版本
new_Thread = threading.Thread._aevent_new # fails when aevent is not loaded class my_thread(new_Thread): ...
或者您可能想创建两个独立的实现,并根据 aevent 上下文进行切换
class _orig_my_thread(threading.Thread._aevent_orig): ... class _new_my_thread(threading.Thread._aevent_new): ... my_thread = aevent.patch__new_my_thread, name="my_thread", orig=_orig_my_thread)
如果您动态生成本地子类,可以将此简化为
def some_code(): class my_thread(threading.Thread._aevent_select()): def run(self): ... job = my_tread() my_thread.start()
其他受影响的模块
您需要在导入 aevent 之前导入任何需要非修补代码的模块。
已知受影响的模块
multiprocessing
内部
aevent 的猴子补丁主要在模块/类级别上进行。 gevent 倾向于修补单个方法。这可能与 gevent 相比,兼容性有所降低。
aevent 通过在其本地 _monkey 目录之前插入导入路径来工作。这些模块试图提供与它们所替代的相同公共接口,同时通过 greenback_ 调用相应的 anyio 函数。
通过 greenback 来实现回切换到异步风格的代码。
aevent 在 Python 3.7 及更高版本上运行。
测试
测试套件使用 trio 作为后端运行。由于 aevent 的猴子补丁,不支持切换后端。但是,您可以设置环境变量 AEVENT_BACKEND 为 asyncio,以使用该后端运行测试套件。
测试套件拉取了 pyroute2 的副本(除了修复与 aevent 无关的错误之外,没有其他更改),并对其测试套件进行测试,从而(主要是)确保该特定包与 aevent 兼容。
项目详情
aevent-0.1.1.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8f54df25454dbae1585f80ce9d193852fc243704c88551b343545f6687e07103 |
|
MD5 | a52d81c678940bd413024b0cd2381217 |
|
BLAKE2b-256 | b22f0e27e1dd69725b802be89b2022fc2940dcf594bd29ee80692dcbe3205750 |