将Cython与Asyncio一起使用(Python 3.4)

Mor*_*riB 6 python cython coroutine python-asyncio

有人设法使Cython与Asyncio协程一起工作吗?我有一个非常简单的例子,在Python中运行良好,并拒绝在Cython中工作:它是我用Cython编译并执行的以下单个文件.执行正确启动但无法运行协同程序.似乎Cython修改了"sometask"协程的类型,然后Asyncio和Inspect不会像往常那样对待它.

#!/usr/bin/env python

import asyncio


@asyncio.coroutine
def sometask():
    counter = 0
    while True:
        print(counter)
        yield from asyncio.sleep(1)
        counter += 1

def runloop():
    loop = asyncio.get_event_loop()
    asyncio.async(sometask())
    try:
        print('Start loop')
        loop.run_forever()
    except KeyboardInterrupt:
        print('Aborted by user')
        loop.close()
Run Code Online (Sandbox Code Playgroud)

更新:目前我通过在一个丑陋的方式修改asyncio/tasks.py文件来检查对象是否是一个生成器的地方让它"工作",而事实上Cython使它成为一个内置函数.这个Cython对象仍然会执行asyncio协同程序的工作,即使它具有与预期不同的类型.

Mor*_*riB 4

幸运的是,Stefan Behnel 在他的 Cython 主分支的最后一个版本中解决了这个问题。

编辑:解决所有问题的提交是 c8a2d30806b4e479515d44ee827b3a1651ac8731

也许更合适的解决方案是在 Python 端,特别是在 Asyncio 中,在不检查生成器类型的情况下识别生成器。完整的解决方案需要 Python 3.4.2(当然 > Python 3.4.0)链接到更多详细信息: https://groups.google.com/forum/#!topic /cython-users/g146SZHxRyM