Těžké OOP problémy

Re:Těžké OOP problémy
« Odpověď #120 kdy: 09. 11. 2019, 10:16:05 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 10:04:21
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
Re:Těžké OOP problémy
« Odpověď #121 kdy: 09. 11. 2019, 10:21:38 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 10:04:21
Citace od: gill kdy 09. 11. 2019, 10:02:41
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

Citace od: Mirek Prýmek kdy 08. 11. 2019, 11:39:01
...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 od: Mirek Prýmek kdy 09. 11. 2019, 09:49:59
To je přece triviální: jakýkoliv kód, který by byl chybný i bez async.

Re:Těžké OOP problémy
« Odpověď #122 kdy: 09. 11. 2019, 10:30:09 »
Citace od: gill kdy 09. 11. 2019, 10:21:38
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 od: gill kdy 09. 11. 2019, 10:21:38
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
CitaceTo 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:

Citace od: gill kdy 09. 11. 2019, 09:45:25
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

  • *****
  • 736
Re:Těžké OOP problémy
« Odpověď #123 kdy: 09. 11. 2019, 10:44:29 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 10:16:05
Citace od: Mirek Prýmek kdy 09. 11. 2019, 10:04:21
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..

  • ****
  • 327
Re:Těžké OOP problémy
« Odpověď #124 kdy: 09. 11. 2019, 10:52:15 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 09:35:58
Citace od: L.. kdy 09. 11. 2019, 08:06:08
Citace od: Mirek Prýmek kdy 08. 11. 2019, 11:39:01
Citace od: Mirek Prýmek kdy 08. 11. 2019, 11:35:36
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

  • *****
  • 2 286
Re:Těžké OOP problémy
« Odpověď #125 kdy: 09. 11. 2019, 11:19:42 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 10:30:09
...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 »
Citace od: Ink kdy 09. 11. 2019, 10:44:29
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

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

  • *****
  • 2 286
Re:Těžké OOP problémy
« Odpověď #127 kdy: 09. 11. 2019, 11:20:49 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 10:30:09
Citace od: gill kdy 09. 11. 2019, 10:21:38
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 od: gill kdy 09. 11. 2019, 10:21:38
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
CitaceTo 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:

Citace od: gill kdy 09. 11. 2019, 09:45:25
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 ;)

Re:Těžké OOP problémy
« Odpověď #128 kdy: 09. 11. 2019, 11:22:16 »
Citace od: L.. kdy 09. 11. 2019, 10:52:15
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

  • *****
  • 2 286
Re:Těžké OOP problémy
« Odpověď #129 kdy: 09. 11. 2019, 11:24:04 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 11:22:16
Citace od: L.. kdy 09. 11. 2019, 10:52:15
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 »
Citace od: Idris kdy 09. 11. 2019, 11:24:04
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 »
Citace od: Idris kdy 09. 11. 2019, 00:32:40
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...

Ink

  • *****
  • 736
Re:Těžké OOP problémy
« Odpověď #133 kdy: 09. 11. 2019, 12:20:45 »
Citace od: Mirek Prýmek kdy 09. 11. 2019, 11:20:00
Citace od: Ink kdy 09. 11. 2019, 10:44:29
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

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.

Ink

  • *****
  • 736
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/