为什么我得到" RuntimeError:在任务任务"中使用yield而不是yield for generator。在尝试使用asyncio时?

时间:2015-02-06 18:22:02

标签: python python-3.x python-asyncio

import asyncio

f = open('filename.txt', 'w')

@asyncio.coroutine
def fun(i):
    print(i)
    f.write(i)
    # f.flush()

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.as_completed([fun(i) for i in range(3)]))
    f.close()

main()

我试图使用python3的新库asyncio。但是我得到这个错误不知道为什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

您遇到的具体错误是因为您尝试将asyncio.as_completed的返回值传递给run_until_completerun_until_complete需要FutureTask,但as_completed会返回迭代器。将其替换为asyncio.wait,返回Future,程序运行正常。

修改

仅供参考,这是使用as_completed的替代实现:

import asyncio

@asyncio.coroutine
def fun(i):
    # async stuff here
    print(i)
    return i

@asyncio.coroutine
def run():
    with open('filename.txt', 'w') as f:
        for fut in asyncio.as_completed([fun(i) for i in range(3)]):
           i = yield from fut
           f.write(str(i))

def main():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())


main()