web-dev-qa-db-ja.com

Python 3.7-asyncio.sleep()およびtime.sleep()

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秒に増やしています。何か特別なものを見たいと思っていますが、そうではありませんでした。

14

コードには非同期処理がほとんどないため、特別なことは何もありません。ただし、主な違いは、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)がスクリプトの実行をブロックしていないことがわかります。

それが役に立てば幸い :)

21
Nimeshka Srimal