python - 将 Cython 与 Asyncio 结合使用(Python 3.4)

标签 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()

更新: 目前,我通过在检查对象是否为生成器的地方以丑陋的方式修改 asyncio/tasks.py 文件来使其“工作”,而实际上 Cython 使其成为内置函数。这个 Cython 对象仍将执行 asyncio 协程的工作,即使它的类型与预期不同。

最佳答案

幸运的是,Stefan Behnel 在他最新版本的 Cython 主分支中针对这个问题做了一个解决方法。

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

可能更合适的解决方案是在 Python 端,尤其是在 Asyncio 中,以在不检查生成器类型的情况下识别生成器。 完整的解决方案需要 Python 3.4.2(肯定 > Python 3.4.0) 链接到更多细节: https://groups.google.com/forum/#!topic/cython-users/g146SZHxRyM

关于python - 将 Cython 与 Asyncio 结合使用(Python 3.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29676317/

相关文章:

python - 如何将组添加到模型的每个实例

python - 具有 5 个数字或 IND/5 个数字的字符串的正则表达式

cython - cupy 支持 cython(例如缓冲索引)吗?

python - python 中的协同程序提供了什么来改进天真的消费者/生产者设置?

python - cookies 切割机的自动化测试

python - 如何将一系列数组转换为 pandas/numpy 中的单个矩阵?

python - 将指针传递给 Cython 中的构造函数

c++ - 用 Cython 包装枚举类

c++ - "co_await other_co"和 "other_co.resume"有什么区别?

c++ - 为什么 STL vector 不能包含协程对象?