iT邦幫忙

0

關於python的asyncio的基本問題

  • 分享至 

  • xImage

各位高人,最近學習python的asyncio時碰到點問題。以下的code是按照這邊的官方教學改的
https://docs.python.org/3/library/asyncio-task.html#coroutines

原本

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    # Wait until both tasks are completed (should take around 2 seconds.)
    await task1
    await task2

asyncio.run(main())

這個執行後會print

hello
world

這個沒有問題,但本人做了以下小修改

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    # Wait until both tasks are completed (should take around 2 seconds.)
    await task1
    print("HERE!")
    await task2

asyncio.run(main())

這個不知為何會print

hello
world
HERE!

而不是我所想的

hello
HERE!
world

還有,我嘗試註解掉await task2

import asyncio
import time

async def say_after(delay, what):
    await asyncio.sleep(delay)
    print(what)

async def main():
    task1 = asyncio.create_task(
        say_after(1, 'hello'))

    task2 = asyncio.create_task(
        say_after(2, 'world'))

    # Wait until both tasks are completed (should take around 2 seconds.)
    await task1
    # await task2

asyncio.run(main())

卻依然得到

hello
world

為什麼world還是會顯示?

謝謝各位看完

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2023-03-21 07:59:49 檢舉
我執行完是你想的沒錯,或許是python版本或你的環境問題。

https://ideone.com/p5GoeK
ccutmis iT邦高手 2 級 ‧ 2023-03-21 10:15:27 檢舉
我用樓主給的源碼測試結果跟 froce 大師 一樣。有點好奇這是什麼情況造成的...
ffaanngg iT邦新手 5 級 ‧ 2023-03-21 10:53:25 檢舉
froce大,最後一個case,你把await task2註解掉還有看到world嗎?
froce iT邦大師 1 級 ‧ 2023-03-21 14:27:48 檢舉
不會。
給你ideone就是要你自己玩看看不是你的環境,會不會有問題。
ffaanngg iT邦新手 5 級 ‧ 2023-03-23 12:00:30 檢舉
謝謝,我的環境問題
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
fadeawaygod
iT邦新手 5 級 ‧ 2023-05-02 16:58:50

問題一: 我看你們說是環境問題就不回答了
問題二: 呼加asyncio.create_task 後就已經將該task存放至event loop等待執行了,不管你之後有沒有去await他,他都會在輪到他的時候執行。

我要發表回答

立即登入回答