在第一個示例中,output我期望在這里,但我不能對第二個示例說同樣的話。從技術上講,在這兩個示例中我都有 3 個tasks(就在第二個示例中,我正在安排 2 個coros執行main coro)不是嗎?在第二個示例中,為什么Event loop不main() coro以與第一個示例相同的方式恢復?
示例 1:
import time
import asyncio
async def coro1():
while True:
print('coro1()')
await asyncio.sleep(0.1) # yield ! Give control back to event loop, to start/resume another task !
async def coro2():
while True:
print('coro2()')
await asyncio.sleep(0.1) # yield ! Give control back to event loop, to start/resume another task !
async def main():
while True:
print('main()')
await asyncio.sleep(0.1) # yield ! Give control back to event loop, to start/resume another task !
if __name__ == '__main__':
loop = asyncio.get_event_loop()
main_task = loop.create_task(main())
task1 = loop.create_task(coro1()) # Schedule execution of coro !
task2 = loop.create_task(coro2()) # # Schedule execution of coro !
loop.run_until_complete(main_task)
loop.close()
示例 1 輸出:
main()
coro1()
coro2()
main()
coro1()
coro2()
main()
coro1()
coro2()
示例 2:
import time
import asyncio
async def coro1():
while True:
print('coro1()')
await asyncio.sleep(0.1) # yield ! Give control back to event loop, to start/resume another task !
async def coro2():
while True:
print('coro2()')
await asyncio.sleep(0.1) # yield ! Give control back to event loop, to start/resume another task !
async def main():
loop = asyncio.get_running_loop()
task1 = loop.create_task(coro1()) # Schedule execution of coro from main !
task2 = loop.create_task(coro2()) # Schedule execution of coro from main !
while True:
print('main()')
await task1 # yield ! Give control back to event loop, to start/resume another task !
await task2 # yield ! Give control back to event loop, to start/resume another task !
if __name__ == '__main__':
loop = asyncio.get_event_loop()
main_task = loop.create_task(main())
loop.run_until_complete(main_task)
loop.close()
示例 2 輸出:
main()
coro1()
coro2()
coro1()
coro2()
coro1()
coro2()
uj5u.com熱心網友回復:
您的任何任務都沒有完成,它們都會無休止地繼續下去。在第一種情況下,每個任務本身只有awaits asyncio.sleep,它確實完成了;然后代碼繼續下一個回圈迭代。
在您的第二種情況下,任務是main任務await的完成coro1(),然后它將繼續其回圈。由于coro1永遠不會完成,它會無限期地卡在這await task1條線上。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517870.html
