Python异步循环可以是异步的吗?

时间:2017-07-19 06:06:11

标签: python asynchronous

我在concurrency is not parallelism幻灯片上看到golang可以这样做:

func main() {
    go boring("Boring!")
    fmt.Println("I'm listening.")
    time.Sleep(2 * time.Second)
    fmt.Println("You're boring; I'm leaving.")
}

结果看起来像这样

I'm listening.
boring 0
boring 1
boring 2
boring 3
boring 4
boring 5
You're boring; I'm leaving.

Python异步循环可以这样做吗?我坚持loop.run_forever它会阻止主要功能:

import asyncio
import random
import time
import itertools


async def boring(msg):
    for i in itertools.count(0):
        print(msg, i)
        await asyncio.sleep(random.random() % 1e3)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    asyncio.ensure_future(boring('boring!'))
    loop.run_forever()
    print('Hello')
    time.sleep(2)
    print('Bye.')
    loop.stop()

然后运行

boring! 0
boring! 1
boring! 2
boring! 3
boring! 4
boring! 5
boring! 6
boring! 7
boring! 8
boring! 9

python异步循环可以是异步吗?

1 个答案:

答案 0 :(得分:0)

loop.run_forever()如果阻止执行。由于您的代码在单个线程中运行,您需要将代码修改为以下内容:

async def boring(msg):
    for i in itertools.count(0):
        print(msg, i)
        await asyncio.sleep(random.random() % 1e3)

async def hello(task):
    print('Hello')
    await asyncio.sleep(2)
    print('Bye.')
    task.cancel()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    t = asyncio.ensure_future(boring('boring!'))
    loop.run_until_complete(hello(t))
    loop.stop()