Python 3.7 – asyncio.sleep() și time.sleep() (Programare, Python, Python 3.X, Python Asyncio, Python 3.7)

o ofertă pe care nu o poți refuza a intrebat.

Când mă duc la asyncio pagina, primul exemplu este un program hello world. Când îl execut pe python 3.73, nu văd nicio diferență față de cel normal, poate cineva să-mi spună care este diferența și să dea un exemplu non-trivial?

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!

Am mărit intenționat timpul de la 1s la 5s, sper să văd ceva deosebit dar nu am văzut.

Comentarii

  • există multe resurse pe această temă… aceasta este una dintre ele: realpython.com/async-io-python –  > Por hiro protagonist.
  • Te așteptai la ceva diferit? –  > Por Kenny Ostrom.
  • @KennyOstrom Da, cred că un exemplu ar trebui să fie unul cât mai simplu și non-trivial –  > Por o ofertă care nu poate fi refuzată.
  • Despre asyncio.sleep precizie stackoverflow.com/a/65727201/13782669 –  > Por alex_noname.
1 răspunsuri
Nimeshka Srimal

Nu vezi nimic special pentru că nu există prea multă muncă asincronă în codul tău. Cu toate acestea, principala diferență este că time.sleep(5) este blocantă, iar asyncio.sleep(5) nu este blocantă.

Când time.sleep(5) este apelat, va bloca întreaga execuție a scriptului și acesta va fi pus în așteptare, pur și simplu înghețat, fără să facă nimic. Dar atunci când apelați await asyncio.sleep(5)va cere buclei de evenimente să ruleze altceva în timp ce instrucțiunea await își termină execuția.

Iată un exemplu îmbunătățit.

import asyncio

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

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

asyncio.run(main())

Va ieși:

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

Puteți vedea că await asyncio.sleep(5) nu blochează execuția scriptului.

Sper că vă ajută 🙂

Comentarii

  • câteva explicații de la mine care m-au ajutat să înțeleg sync vs. async sleep – dacă aveți nevoie să puneți pe pauză execuția unui întreg script (care ar trebui să lucreze concomitent), este sleep. Dacă aveți nevoie să puneți pe pauză o singură cortină, este asyncio.sleep –  > Por Vladimir Kolenov.
  • Corecție: Ați scris „Când este apelat time.sleep(5), acesta va bloca întreaga execuție a scriptului”. Acest lucru este valabil doar pentru scriptul cu un singur fir. Dar pentru cazul general este incorect. time.sleep(5) blochează doar firul curent. –  > Por eyalzba.
  • @eyalzba da, are sens. Vă mulțumim pentru adăugarea acestui comentariu 🙂 –  > Por Nimeshka Srimal.
  • Acesta ar trebui să fie exemplul oficial „hello world”. –  > Por C S.