Synchrónne.
A to je zle?
Áno, veľmi zle.
To nie je možné!
Áno je to možné a naviac spôsobuje problémy sebe aj spolupracovníkom.
Tak ako to teda je?
Zoberme si nasledujúcu modelovú situáciu, na ktorej sa mladý a nádejný developer učí v škole myslieť. Algoritmus je mu podaný, akože je to niečo ako repcet:
- múku nasypeme na pracovnú dosku, pridáme cukor a citrónovú kôru
- do stredu rozbijeme vajce a po bokoch navrstvíme nakrájané maslo
- pomocou noža zmes premiešavame a sekáme, kým nevznikne hrudkovitá zmes
- potom veľmi rýchlo rukami zmes spracujeme …
- …
- rúre vyhriatej na 180°C pečieme asi 10 minút
- upečené vajíčka zložíme z plechov a necháme dobre vychladnúť…
Už vidíte, v čom je problém? Tak ešte raz. Tvrdím, že veľkým problémom vývojárov je ich sklon k synchrónnemu mysleniu. Ešte stále to nie je jasné? Tak pokúsme sa recept naprogramovať.
from com.samoobsluha import flour, sugar, lemonPeel
from my.refrigerator import egg, butter
def pecenieJeHrou():
desk.add(flour.pour())
desk.add(sugar.pour())
desk.add(lemonPeel.getPiece())
desk.add(egg.smash())
desk.add(egg.smash())
...
sleep(60*10)
eggCollection = owen.getBackedEggs()
while(eggCollection.isHot()):
sleep(10)
...
Veď ale ten program funguje, tak kde je problém? Tak si to skúste na vlastnej koži. Dajte koláč do trúby a zaspite pri nej na 10 minút. Potom keď koláč vytiahnite, tak ho pravidelne čo 10 sekúnd testujte, či už je chladný. A pozor nesmiete robiť nič iné, pretože myslíte synchrónne.
Každá gazdniká by vás s takouto implementáciou pečenia presmerovala cez okno smerom na hnoj k sliepkam. Pretože keď už sa pečie, tak si predsa nastaví minutky a popri tom ide robiť niečo ďalšie. Napríklad umyje riady, ktoré sa pri pečení použili. A keď zazvoní minutka, tak skontroluje stav koláča, vytiahne ho z trúby a vráti sa späť k upratovaniu.
Áno, pozorný čitateľ, správne identifikoval v texte o gazdninke rafinovane ukrytý inotaj vo forme minutky a zvukového signalu. Jedná sa o Event Listener.
A čo z toho pre nás plynie: Každý deň napíšeme o jednu sychnrónnu funkciu menej a o jednu asynchrónnu viac.