Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写一个异步协同程序';s与python 2和3兼容_Python_Python 3.x_Asynchronous_Python Asyncio - Fatal编程技术网

编写一个异步协同程序';s与python 2和3兼容

编写一个异步协同程序';s与python 2和3兼容,python,python-3.x,asynchronous,python-asyncio,Python,Python 3.x,Asynchronous,Python Asyncio,通常,要编写与python 2/3兼容的代码,您需要遵循两个解释器都能理解的特定样式,例如: 但是,由于asyncio引入了诸如async def和await function()之类的语法,如果在Python 2下运行,这将导致解析错误 如何编写一个兼容python 2和python 3的库,它仍然可以提供异步IO接口?如果没有简单的方法可以做到这一点,是否可以在库中创建只能在python 3.5+中导入的特定异步子模块?在python 2中支持异步样式的协同例程是不可能的,因为python

通常,要编写与python 2/3兼容的代码,您需要遵循两个解释器都能理解的特定样式,例如:

但是,由于asyncio引入了诸如
async def
await function()
之类的语法,如果在Python 2下运行,这将导致解析错误


如何编写一个兼容python 2和python 3的库,它仍然可以提供异步IO接口?如果没有简单的方法可以做到这一点,是否可以在库中创建只能在python 3.5+中导入的特定异步子模块?

在python 2中支持异步样式的协同例程是不可能的,因为python 2没有:

  • 异步定义
    等待
  • 他们的前身从中获益
  • 异步IO库本身,任何形状或形式

有一个项目是使用普通生成器创建Python 2版本的asyncio,而不是从中获得
收益,但这是多年前的事了。

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

下面的例子完全属于“是的,你可以,但是为什么你会呢?”“天真的测试表明它可以在CPython 2.6.9到3.7.3上运行,异步IO代码只能在3.5或更高版本上加载

from\uuuuu future\uuuuu导入打印功能
导入系统
ASYNC_SOURCE=“”
导入异步
异步定义三()
打印('3')
"""
如果系统版本信息[0]>2和系统版本信息[1]>4:
exec(编译(异步源代码,文件,exec)
def two():
打印(“两个”)
如果名称=“\uuuuu main\uuuuuuuu”:
二()
如果在locals()中为“三”:
asyncio.run(三个()

您是否有任何特定的理由支持传统Python(生命周期结束后不到一年)。我可能不会用Python 2和Python构建一个新的库(特别是异步库),如果您确实想支持旧版本,那么您必须避免使用async/await和threading/eventlet,或者使用Generator/yield语句实现异步协程。这不是针对新库,而是针对支持2和3的现有库。但是在任何情况下,对于希望支持任何版本的Python 3的库来说,问题仍然存在。异步生成器是否没有被弃用?它们在Python3的未来版本中仍然有效吗?如果是这样的话,您是否介意写一个答案,因为这可能是我的解决方案Sync生成器仅在Python 3.6及更高版本中可用,并且肯定不会被弃用。Python2和Python3中都有普通的生成器,也不推荐使用。不推荐使用的是使用生成器来实现协同路由,即
@asyncio.coroutine
装饰器。但即使是这种生成器也严重依赖于关键字的
收益率和
asyncio
框架,这两种框架在Python 2中都不可用。在这种情况下,我的第二个问题是什么:“是否有可能在库中创建一个只能在Python 3.5+中导入的异步子模块?”,异步子模块没有什么神奇之处。