有人设法让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()
更新: 目前,我通过在一个丑陋的方式修改asyncio / tasks.py文件来检查对象是否是一个生成器的地方,使其“工作”,而实际上Cython使它成为一个内置函数。这个Cython对象仍然会执行asyncio协程的工作,即使它的类型与预期的不同。
答案 0 :(得分:4)
幸运的是,Stefan Behnel在他最后一个版本的Cython主分支中解决了这个问题。
编辑:解决所有问题的提交是c8a2d30806b4e479515d44ee827b3a1651ac8731
可能更合适的解决方案是在Python端,特别是在Asyncio中,识别生成器而不检查其类型。 完整的解决方案需要Python 3.4.2(确保> Python 3.4.0) 链接到更多详细信息: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM