将 Cython 与 Asyncio 结合使用 (Python 3.4)
Using Cython with Asyncio (Python 3.4)
有人设法让 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 文件来使它成为 "work",而实际上 Cython 使它成为一个内置函数。这个 Cython 对象仍然会执行 asyncio 协程的工作,即使它的类型与预期的不同。
幸运的是,Stefan Behnel 在他的最新版本的 Cython 主分支中解决了这个问题。
编辑:解决所有问题的提交是 c8a2d30806b4e479515d44ee827b3a1651ac8731
在 Python 方面,尤其是在 Asyncio 中,可能更合适的解决方案是在不检查生成器类型的情况下识别生成器。
完整的解决方案需要 Python 3.4.2(当然 > Python 3.4.0)
Link 更多详情:
https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM
有人设法让 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 文件来使它成为 "work",而实际上 Cython 使它成为一个内置函数。这个 Cython 对象仍然会执行 asyncio 协程的工作,即使它的类型与预期的不同。
幸运的是,Stefan Behnel 在他的最新版本的 Cython 主分支中解决了这个问题。
编辑:解决所有问题的提交是 c8a2d30806b4e479515d44ee827b3a1651ac8731
在 Python 方面,尤其是在 Asyncio 中,可能更合适的解决方案是在不检查生成器类型的情况下识别生成器。 完整的解决方案需要 Python 3.4.2(当然 > Python 3.4.0) Link 更多详情: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM