我正在努力理解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
线程的程序结束时正在进行的循环。
然后我希望至少有两个并行运行的第一个线程(a
和b
)(最坏的情况是,添加第三个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()
)?
答案 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()