Těžké OOP problémy

Re:Těžké OOP problémy
« Odpověď #120 kdy: 09. 11. 2019, 10:16:05 »
To je implementační detail bez jakéhokoliv dopadu na cokoliv, co jsem napsal.
BTW, kdybys chtěl nějaký větší rozdíl, tak největší, co mě napadá, je že await může být lazy nebo eager. Jak teď koukám, Rust má lazy. JS má eager (AFAIK).

Taky by šlo promisy z awaitů paralelizovat (k tomu právě směřovala ta moje testovací otázka). Jestli to nějaký jazyk skutečně dělá, to nevím. Obávám se, že spíš ne, protože v jazyce s mutable shared state by to bylo obtížné až nemožné udělat korektně.


gill

  • ****
  • 270
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #121 kdy: 09. 11. 2019, 10:21:38 »
Await v JS akceptuje thenable objekty, narozdíl od await v Pythonu neakceptuje generátory.
To je implementační detail bez jakéhokoliv dopadu na cokoliv, co jsem napsal.

o async/await jsi zatím nic nenapsal, jen otázku

...anebo pokud bys měl o něm vysoké mínění, můžeš se ho zkusit zeptat, za jakých podmínek je podle něj bezpečné používat await v multivláknovém prostředí :)
na kterou jsi odpověděl
To je přece triviální: jakýkoliv kód, který by byl chybný i bez async.
« Poslední změna: 09. 11. 2019, 10:23:50 od gill »

Re:Těžké OOP problémy
« Odpověď #122 kdy: 09. 11. 2019, 10:30:09 »
o async/await jsi zatím nic nenapsal, jen otázku
Aha, já jsem se spíš bál, že mi zas někdo vynadá, že vlákno o OOP plevelím debatou o await :) Tak jo, fajn :)

Citace
...anebo pokud bys měl o něm vysoké mínění, můžeš se ho zkusit zeptat, za jakých podmínek je podle něj bezpečné používat await v multivláknovém prostředí :)
na kterou jsi odpověděl
Citace
To je přece triviální: jakýkoliv kód, který by byl chybný i bez async.
To není odpověď na tuhle otázku. To je odpověď na tvoji otázku:

mohl bys ukázat příklad v tom jiném jazyku, kde je podle tebe await nebezpečné ve vícevláknovém prostředí? Bavili jsme se o await v JS.

...protože, jak víme, jestliže z podmínek A plyne ^B, tak pořád ještě nevíme, z čeho vyplývá B :)

---

Nicméně mám nepříjemný pocit, že ti nejde o diskusi ale jenom o tahání se za nohu. Nemám úplně zájem se na tom podílet...

Ink

  • ***
  • 241
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #123 kdy: 09. 11. 2019, 10:44:29 »
To je implementační detail bez jakéhokoliv dopadu na cokoliv, co jsem napsal.
BTW, kdybys chtěl nějaký větší rozdíl, tak největší, co mě napadá, je že await může být lazy nebo eager. Jak teď koukám, Rust má lazy. JS má eager (AFAIK).

Taky by šlo promisy z awaitů paralelizovat (k tomu právě směřovala ta moje testovací otázka). Jestli to nějaký jazyk skutečně dělá, to nevím. Obávám se, že spíš ne, protože v jazyce s mutable shared state by to bylo obtížné až nemožné udělat korektně.

Máš na mysli paralelní polling, něco jako https://docs.rs/futures/0.3.1/futures/macro.join.html ? Nebo něco komplikovanějšího? V téhle problematice nemám zkušenosti.

L..

Re:Těžké OOP problémy
« Odpověď #124 kdy: 09. 11. 2019, 10:52:15 »
Používat a dobře rozumět jsou dvě odlišné věci. Zkus se třeba náhodně vybraného webaře zeptat, jak souvisí await s promisy a uvidíš, jak se v tom začne zamotávat :)
...anebo pokud bys měl o něm vysoké mínění, můžeš se ho zkusit zeptat, za jakých podmínek je podle něj bezpečné používat await v multivláknovém prostředí :)

No, vzhledem k tomu, že JS (webový i NodeJS) je single-thread, tak ta otázka poněkud nedává smysl ;-)
V té větě, na kterou reaguješ, ale "JS" vůbec není.

Asi máš sníženou schopnost chápat psaný text, takže to pro tebe rozeberu: V tvé větě je "můžeš se HO zkusit zeptat" a to "ho" odkazuje na citovanou větu z předchozího příspěvku, kde se píše "Zkus se třeba náhodně vybraného webaře zeptat". Tedy kontext tvé věty je jasný: Web. Tam existuje jen jedno rozumně rozšířené běhové prostředí - Javascript - které je z definice jednovláknové, tedy tvoje otázka tam nedává smysl a na to jsem reagoval.

Už je to jasnější, nebo mám být ještě podrobnější?


Idris

  • *****
  • 947
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #125 kdy: 09. 11. 2019, 11:19:42 »
...protože, jak víme, jestliže z podmínek A plyne ^B, tak pořád ještě nevíme, z čeho vyplývá B :)
To platí jen pro dedukci, v jiném typu vyplývání (inference) to je jinak, například v případě abdukce ;)

To jen tak, aby se nepatřičně nezobecňovalo :) Možná jsi implicitně předpokládal jen modus ponens, inferencí je spousta typů.

Re:Těžké OOP problémy
« Odpověď #126 kdy: 09. 11. 2019, 11:20:00 »
Máš na mysli paralelní polling, něco jako https://docs.rs/futures/0.3.1/futures/macro.join.html ? Nebo něco komplikovanějšího? V téhle problematice nemám zkušenosti.
Napadají mě minimálně dva rozdílné způsoby, jak by se to dalo implementovat:

1. Promisy běží (potenciálně) skutečně paralelně, každý (potenciálně) na svém jádře

2. Promisy jsou odstartované "zaráz" (rychle po sobě), ale paralelně běží jenom operace "mimo jazyk" (typicky IO)

To první je asi jasný. To druhý je jenom "jakože paralelní" v JS stylu. Od serializovaných awaitů by se to poznalo tak, že
Kód: [Vybrat]
await sleep(1)
await sleep(1)
await sleep(1)
by netrvalo ~ tři sekundy, ale ~ jednu.

To druhé v JS jde implementovat, ale musí se to (AFAIK) udělat ručně přes Promise.all()

Idris

  • *****
  • 947
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #127 kdy: 09. 11. 2019, 11:20:49 »
o async/await jsi zatím nic nenapsal, jen otázku
Aha, já jsem se spíš bál, že mi zas někdo vynadá, že vlákno o OOP plevelím debatou o await :) Tak jo, fajn :)

Citace
...anebo pokud bys měl o něm vysoké mínění, můžeš se ho zkusit zeptat, za jakých podmínek je podle něj bezpečné používat await v multivláknovém prostředí :)
na kterou jsi odpověděl
Citace
To je přece triviální: jakýkoliv kód, který by byl chybný i bez async.
To není odpověď na tuhle otázku. To je odpověď na tvoji otázku:

mohl bys ukázat příklad v tom jiném jazyku, kde je podle tebe await nebezpečné ve vícevláknovém prostředí? Bavili jsme se o await v JS.

...protože, jak víme, jestliže z podmínek A plyne ^B, tak pořád ještě nevíme, z čeho vyplývá B :)

---

Nicméně mám nepříjemný pocit, že ti nejde o diskusi ale jenom o tahání se za nohu. Nemám úplně zájem se na tom podílet...
Nech ho už chudáčka, vždyť jen mele ;)
« Poslední změna: 09. 11. 2019, 11:22:56 od Idris »

Re:Těžké OOP problémy
« Odpověď #128 kdy: 09. 11. 2019, 11:22:16 »
Asi máš sníženou schopnost chápat psaný text, takže to pro tebe rozeberu: V tvé větě je "můžeš se HO zkusit zeptat" a to "ho" odkazuje na citovanou větu z předchozího příspěvku, kde se píše "Zkus se třeba náhodně vybraného webaře zeptat". Tedy kontext tvé věty je jasný: Web. Tam existuje jen jedno rozumně rozšířené běhové prostředí - Javascript - které je z definice jednovláknové, tedy tvoje otázka tam nedává smysl a na to jsem reagoval.

Už je to jasnější, nebo mám být ještě podrobnější?
Je mi to jasný celou dobu. Akorát jsi to pochopil jinak, než jsem to myslel. Myslel jsem tohle: chceš-li zjistit, jestli průměrný webař opravdu rozumí mechanismu async/await, zkus mu položit obecnou otázku [...]

Idris

  • *****
  • 947
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #129 kdy: 09. 11. 2019, 11:24:04 »
Asi máš sníženou schopnost chápat psaný text, takže to pro tebe rozeberu: V tvé větě je "můžeš se HO zkusit zeptat" a to "ho" odkazuje na citovanou větu z předchozího příspěvku, kde se píše "Zkus se třeba náhodně vybraného webaře zeptat". Tedy kontext tvé věty je jasný: Web. Tam existuje jen jedno rozumně rozšířené běhové prostředí - Javascript - které je z definice jednovláknové, tedy tvoje otázka tam nedává smysl a na to jsem reagoval.

Už je to jasnější, nebo mám být ještě podrobnější?
Je mi to jasný celou dobu. Akorát jsi to pochopil jinak, než jsem to myslel. Myslel jsem tohle: chceš-li zjistit, jestli průměrný webař opravdu rozumí mechanismu async/await, zkus mu položit obecnou otázku [...]
To ale musíš mít žaludek na ty odpovědi, co z něj vylezou.

Re:Těžké OOP problémy
« Odpověď #130 kdy: 09. 11. 2019, 11:26:08 »
To ale musíš mít žaludek na ty odpovědi, co z něj vylezou.
Právě, no. Proto bych si spolu s gillem (nebo kdo to říkal) netroufnul tvrdit, že "každý, kdo to používá, tomu rozumí" :)

Re:Těžké OOP problémy
« Odpověď #131 kdy: 09. 11. 2019, 11:58:07 »
Takže kdo ho má největšího?

Re:Těžké OOP problémy
« Odpověď #132 kdy: 09. 11. 2019, 12:04:48 »
Koukám právě narvali async/await do Rustu. To je fakt mor.
To je smutný. Zrovna od Rustu bych čekal, že se omezí na CSP. Třeba vtáhne Actix do standardní knihovny nebo tak něco.

Rust pořádně neznám, takže neumím posoudit implementaci, ale pokud by to ve finále vedlo ke stejnýmu zmatku jako kdysi v Pythonu - pro každou knihovnu bude x verzí, jedna sync, jedna nad Actix, jedna nad Tokio a pak ještě jedna s async/await, přičemž každá jinak zabugovaná, tak by to byl teda fakt smutný příběh jinak moc pěkného jazyka...
« Poslední změna: 09. 11. 2019, 12:11:39 od Mirek Prýmek »

Ink

  • ***
  • 241
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #133 kdy: 09. 11. 2019, 12:20:45 »
Máš na mysli paralelní polling, něco jako https://docs.rs/futures/0.3.1/futures/macro.join.html ? Nebo něco komplikovanějšího? V téhle problematice nemám zkušenosti.
Napadají mě minimálně dva rozdílné způsoby, jak by se to dalo implementovat:

1. Promisy běží (potenciálně) skutečně paralelně, každý (potenciálně) na svém jádře

2. Promisy jsou odstartované "zaráz" (rychle po sobě), ale paralelně běží jenom operace "mimo jazyk" (typicky IO)

To první je asi jasný. To druhý je jenom "jakože paralelní" v JS stylu. Od serializovaných awaitů by se to poznalo tak, že
Kód: [Vybrat]
await sleep(1)
await sleep(1)
await sleep(1)
by netrvalo ~ tři sekundy, ale ~ jednu.

To druhé v JS jde implementovat, ale musí se to (AFAIK) udělat ručně přes Promise.all()

V tom je ten vtip - Rust není magický jazyk, nedělá žádné legrácky typu GC a automatickou paralelizaci. Programátor v Rustu by vždycky měl rozumět tomu, co dělá, když překročí hranice, kompilátor ho pošle k šípku a pak se dotyčný musí zamyslet a konflikt představ vyřešit. Třeba si vem takový Rayon - na první pohled to vypadá jako velká magie, která vyřeší něco za Tebe, on skutečně leccos umí díky možnostem, které Rust a jeho typový systém umožňuje, jenže pak zjistíš, že pro paralelní iterátor buďto musíš použít nějakou kolekci, kterou Rayon podporuje nebo si budeš muset naimplementovat příslušný trait nebo se na to (jako já, když jsem si s tím hrál) vykašleš úplně a prostě si uděláš vlastní paralelní iterátor, který si synchronizaci řeší sám. To není moc těžké, ale musíš u toho přemýšlet a narazíš pak (jako já) třeba na to, že objekt má delší životnost, než ses domníval a najednou se výpočet provádí de facto sekvenčně.

Proto bych osobně neočekával, že tohle Rust kdy bude dělat sám - můžeš mít simultánní polling, ale ty přesahy mezi vlákny si řešíš sám v nižší vrstvě. Nebo tam holt budeš mít nějaký objekt, který to bude umět řešit elegantně za Tebe oboje, ale zase budeš muset splnit nějaké podmínky na obou koncích - v té paralelní metodě pro multithread a v tom "klientu" v původním vláknu.
« Poslední změna: 09. 11. 2019, 12:24:45 od Ink »

Ink

  • ***
  • 241
    • Zobrazit profil
    • E-mail
Re:Těžké OOP problémy
« Odpověď #134 kdy: 09. 11. 2019, 12:29:39 »
No a s tím sleepem a joinem je zrovna pár hodin starý dotaz a vysvětlení na Redditu: https://www.reddit.com/r/rust/comments/dtp6z7/what_can_i_actually_do_with_the_new_async_fn/