如何启动协同程序并继续执行同步任务?

时间:2017-08-20 09:00:13

标签: python multithreading asynchronous async-await python-asyncio

我正在努力理解asyncio并将threading的未成年人移植到其中。我将以两个无限运行的线程和一个非线程循环(所有这些都输出到控制台)为例。

threading版本

import threading
import time

def a():
    while True:
        time.sleep(1)
        print('a')

def b():
    while True:
        time.sleep(2)
        print('b')

threading.Thread(target=a).start()
threading.Thread(target=b).start()
while True:
        time.sleep(3)
        print('c')

我现在尝试根据documentation将其移至asyncio

问题1 :我不明白如何添加非线程任务,因为我看到的所有示例都显示了在管理asyncio线程的程序结束时正在进行的循环。

然后我希望至少有两个并行运行的第一个线程(ab)(最坏的情况是,添加第三个c作为线程,放弃混合线程和非线程操作的想法):

import asyncio
import time

async def a():
    while True:
        await asyncio.sleep(1)
        print('a')

async def b():
    while True:
        await asyncio.sleep(2)
        print('b')

async def mainloop():
    await a()
    await b()

loop = asyncio.get_event_loop()
loop.run_until_complete(mainloop())
loop.close()

问题2 :输出是a的序列,表示根本没有调用b()协程。是不是await应该开始a()并返回执行(然后开始b())?

1 个答案:

答案 0 :(得分:3)

await停止执行某个点,您执行await a(),并且您在a()中有一个无限循环,因此它的逻辑b()没有&#39}被叫。考虑一下,就好像在a()中插入mainloop()

考虑这个例子:

async def main():
    while True:
        await asyncio.sleep(1)
        print('in')

    print('out (never gets printed)')

要实现您想要的目标,您需要创建一个管理多个协同程序的未来。 asyncio.gather就是为了这个。

import asyncio


async def a():
    while True:
        await asyncio.sleep(1)
        print('a')


async def b():
    while True:
        await asyncio.sleep(2)
        print('b')


async def main():
    await asyncio.gather(a(), b())


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()