跳转到主要内容

从异步代码中调用同步Python,不阻塞

项目描述

aevent 允许您从异步代码调用无聊的同步Python。不阻塞或将 asyncawait 撕裂到它上面。理想情况下,这不需要修改同步代码。

换句话说,aeventgevent 来说就像 anyiogreenlet 一样。

也就是说,它用 anyio 的调用替换了标准Python函数,而不是 gevent

适用一些限制。

用法

在任何其他导入之前,将此代码块插入到您的主代码中

import aevent
aevent.setup('trio')  # or asyncio, if you must

这会让各种代码检查器感到烦恼,但这是不可避免的。

使用 aevent.run 启动主循环,或在需要使用修补代码的任务(s)中调用 await aevent.per_task()

可以使用 aevent.nativeaevent.patched 上下文管理器暂时禁用或重新启用 aevent 的修补。

支持函数

aevent 以两种方式猴子补丁 anyioTaskGroup.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_BACKENDasyncio,以使用该后端运行测试套件。

测试套件拉取了 pyroute2 的副本(除了修复与 aevent 无关的错误之外,没有其他更改),并对其测试套件进行测试,从而(主要是)确保该特定包与 aevent 兼容。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪一个,请了解更多关于 安装包 的信息。

源分发

aevent-0.1.1.tar.gz (19.8 kB 查看哈希值)

上传时间

由以下机构支持