【发布时间】:2015-06-22 22:53:45
【问题描述】:
有人设法让 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 对象仍将完成异步协程的工作,即使它的类型与预期不同。
【问题讨论】:
-
谢谢,我复制粘贴 Stefan Behnel 的答案,也许有人找到了解决这个问题的方法:“我的猜测是它是 asyncio 中的一个错误。它是“types.GeneratorType”和 Cython 生成器的特殊情况不是那种类型。请参阅 asyncio/coroutines.py 中的“_COROUTINE_TYPES”和“iscoroutine()”。遗憾的是,Python 中没有生成器的 ABC。Stefan“
标签: python cython coroutine python-asyncio