编写与Python 2和3兼容的异步协程

时间:2019-01-03 13:13:45

标签: python python-3.x asynchronous python-asyncio

通常要编写python 2/3兼容代码,您要遵循两种解释器都可以理解的某种样式,例如:https://python-future.org/compatible_idioms.html

但是,由于asyncio引入了async defawait function()之类的语法,因此如果在Python 2下运行,则会导致解析错误。

如何编写兼容python 2和python 3且仍可以提供asyncio接口的库?如果没有简便的方法,是否可以在库中制作一个只能在python 3.5+中导入的异步子模块?

2 个答案:

答案 0 :(得分:1)

在Python 2中无法支持异步样式的协程,因为Python 2没有以下功能:

  • async defawait;
  • 他们的前任yield from;
  • asyncio库本身,以任何形状或形式。

有一个项目使用不带yield from的普通生成器来创建asyncio的Python 2版本,但这是abandoned年前。

答案 1 :(得分:0)

虽然在Python 2中支持async def函数是不可行的,但可能创建一个包含async def函数的模块,这些模块仅在Python 3.5或更高版本中导入。但! 可能有更好的解决方法,例如将异步代码放入不同的模块,程序包或完全独立的库中。

下面的示例完全属于“ 是的,但是为什么会这样? ”类别。朴素的测试表明它可以在CPython 2.6.9上运行3.7.3,异步代码仅在3.5或更高版本上加载。

from __future__ import print_function
import sys


ASYNC_SOURCE = """
import asyncio

async def three():
    print('three') 
"""
if sys.version_info[0] > 2 and sys.version_info[1] > 4:
    exec(compile(ASYNC_SOURCE, __file__, "exec"))


def two():
    print("two")


if __name__ == "__main__":
    two()
    if "three" in locals():
        asyncio.run(three())