1. ホーム
  2. python

[解決済み] Python 3.7 - asyncio.sleep()とtime.sleep()

2022-01-30 11:42:31

質問

にアクセスすると asyncio のページでは、最初の例として、hello world プログラムが紹介されています。これをpythonで実行すると 3.73 は、通常のものと何ら変わりはありませんね。 誰かその違いや、簡単な例を教えてください。

In [1]: import asyncio
   ...:
   ...: async def main():
   ...:     print('Hello ...')
   ...:     await asyncio.sleep(5)
   ...:     print('... World!')
   ...:
   ...: # Python 3.7+
   ...: asyncio.run(main())
Hello ...
... World!

In [2]:

In [2]: import time
   ...:
   ...: def main():
   ...:     print('Hello ...')
   ...:     time.sleep(5)
   ...:     print('... World!')
   ...:
   ...: # Python 3.7+
   ...: main()
Hello ...
... World!

何か特別なものが見られるかもしれないと思い、わざと1秒から5秒まで時間を長くしてみたが、見られなかった。

解決方法は?

あなたのコードには非同期処理はあまりないので、特別なことは何も見えていないでしょう。しかし、主な違いは time.sleep(5) はブロック化されており asyncio.sleep(5) はノンブロッキングです。

いつ time.sleep(5) が呼び出されると、スクリプトの実行がすべてブロックされ、何もせずにただ固まっているだけの状態になります。しかし await asyncio.sleep(5) を実行すると、await 文の実行が終了するまでの間、イベントループに他の処理を依頼します。

以下は改良された例です。

import asyncio

async def hello():
    print('Hello ...')
    await asyncio.sleep(5)
    print('... World!')

async def main():
    await asyncio.gather(hello(), hello())

asyncio.run(main())

出力されます。

~$ python3.7 async.py
Hello ...
Hello ...
... World!
... World!

を見ることができます。 await asyncio.sleep(5) はスクリプトの実行をブロックしていません。

お役に立てれば幸いです :)