Hogyan lehet megszakítani egy aszinkron funkció végrehajtását kívülről?

> A végrehajtás megszakításának szükségessége hosszú álomba és hosszú hálózati működésbe kerülhet

Ez nem lehet, ez a lényeg csomópontok (vagy akár libev), amely az összes IO-műveletet delegált másik szál a „számítástechnika” csomópontok patak, sőt, csak kalbeki (explicit, beleértve az időzítő, és implicit).

> Az állandó lobogóellenőrzés minden egyes váró előtt megöli a megoldás minden eleganciáját

A másik út, nem, mert senki más nem fogja tudni, hogy ellenőrizze a szükségességét megállás, Noda (vagy V8) egyszálú, és sok computing „folyamatos” funkció nem lesz képes beavatkozni még egy eseménykezelő (például a jelet IO vagy a szomszédos worker`s).

Ha hosszú, de megszakított számításokra van szüksége, küldje el őket az eladónak (például a fürtmodul használatával), és ha szükséges, ölje meg a vorkert (újra létrehozza).

Dark Hole. próbálja meg C ++ -et is megérteni, mi a többszálú programozás, mutexek, kritikus szakaszok, szemaforák. Akkor próbáld Erlang vagy Smalltolk, próbálj meg felfogni a multitasking más paradigmáit, például a színészmodellt. És vissza szeretne programozni a Noda-val a szerelemben, és nem csak mancsoknak hívja, mert egy időben egy iskolás így szólt, képtelen több mint két megközelítést illeszteni a fejében egy absztrakt probléma megoldásához :).

napa3um. valahogy azt mondod, hogy ez azt jelenti, hogy "nem", a fenti példában az alvás az időzítő + promis segítségével valósul meg. Most képzeld el, hogy az aszinkron funkcióban 60 másodpercig aludtál, és a fő szálban (vagy egy másik async funkciónál) meg kell szakítanod az aszinkrefunkciót, és tisztítsd meg a szemetet.

Mikhail Yurievich. Már válaszolt a kérdésedre. Ha a függvény folyamatosan kiszámít valamit, akkor nem lehet leállítani ugyanabból a szálból, mert csak ezt a funkciót értékeljük (még kalbeki IO-események vagy időzített eseményeket nem lehet végrehajtani, ha a funkció önmagában nem olyan aszinkron műveletek). Ebben az esetben az egyetlen módja annak, hogy szakítsa meg a számítás -, hogy azokat a munkavállaló és a köröm a munkavállaló, ha szükséges. Ha a függvény nem számítja semmit, és csak arra vár, hogy az esemény az időzítő (a csomópont időzítők nem fagyott patak, de csak az okoz kalbeki egy meghatározott időpontban), majd megszünteti a végrehajtását ez a várakozás elég, hogy elpusztítsa az időzítő funkció hívás clearTimeout. Ne habozzon, hogy félreértett valamit, aszinkron végrehajtási modell - nem is olyan egyszerű téma és nem csupán elméletben, hanem a gyakorlatban, hogy „megvilágosodott megértés” :).

napa3um. köszönöm a tisztázást! most már teljesen megvilágosodtam. Itt látom, hogy nem szükséges folytatni a beszélgetést veled :) bár ez megvilágít, és gyönyörű megoldást kínál arra, hogyan kell megszakítani az aszinkron funkciót, amelyben 5 csúszka és 5 tcp kapcsolata van köztük. Csak kérjük, ne csússzon le a vorkerekhez és a nehéz számításokhoz, ami valójában nem megy

„Szép megoldás, mint a megszakítási aszinkron működését, amelynek 5 kombiné és legalább 5 tcp kapcsolatok” -, hogy elpusztítsa az időzítő, amely megteremti a „slip” (kivéve az időzítő létre a szundi, az azonos külső változó társítható egy adott funkciót, amely azt szeretné, hogy "megszakítsam", majd hívja clearTimeout-ot, ha meg akarja szakítani a funkciót). Ha nem akarod felbukkanni a standokat.

ebben az esetben egy ilyen alapvetően rossz megközelítésnek szuper számítógépnek és fürtnek kell lennie, hogy segítsen neked.
Változtasd meg a megközelítés, hogy a elve Event Hurok (mint nginx csinál, mint a csomópont-alapú), akkor nem lesz szükség a alvás, és aszinkron munkás maga megkapja a szükséges jeleket. A 10 k-os állapotot (nem műveleteket) több munkatárs kiszolgálhatja, anélkül, hogy befolyásolná a hardver teljesítményét. Nem szabad elfelejteni, hogy a valóságban csak egy műveletet végzünk a CPU, csak meg kell nyomon követni az állam, és senki sem zavar, hogy keverje az állam a megszakítás jelet, a jel, hogy menjen át a száz vagy két loop-ok és m. Nézzétek meg alaposan a "reaktív programozás" (RxJS) módszerét. Ugyanakkor a probléma megoldására, amely még nem volt ideje, hogy az tükrözze - a szervezet elosztott „read-write”: az adatszolgáltatásra 10k folyamatok lesz a „pull” adatfolyamot a patak, majd a „húzza” az adatokat az egyes folyamatokat. Nem nehéz kitalálni, hogy minden egyes folyamatnak valamit valahol el kell vennie, és olyan adatokat kell generálnia, amelyeket valahol hozzá kell adni. Ehhez nincs szükség 2 × 10k folyamatra?

Nincs "a megoldás kegyelme", ​​mert nincs ilyen megoldás :(

Annak érdekében, hogy ne szakítsa meg az agyat az Rx-ről - itt van a kiságy

Már 25 éve programozó tanárok azt mondták: a közvetlen átmenetek és a noop (alvó) funkciók csak azt jelentik, hogy nem tudod programozni. És az első helyen - helyesen állítsa be a feladatot, és válassza ki a helyes megoldási módot.

továbbra is megpróbálhatja megmondani a PHP-ben szerzett tapasztalataidat, tanítani és oktatni másokat, de kérjük, ha nincs megoldása a kérdés témájáról (félbeszakítsa az aszinkfunkciót kívülről) - adja át, ne mutasson alkalmatlanságát

olvasás: korutiny, zöld szálak, itt egy példa a python / gevent www.gevent.org/gevent.html (kill módszer)
törlés (visszavonás / pusztulás / dobás) hajtják végre vagy olyan formában minden normál könyvtárakban, például ugyanabban a Bluebird: bluebirdjs.com/docs/api/cancellation.html - de ez egy mankó, mert meg kell adnunk egy visszavonási visszahívást minden olyan művelethez, amely érdekel minket

a saját kérdésére válaszolva az első bejegyzésből - a JS specifikációban a jelenlegi időben nincs mechanizmus az aszinkron funkció visszavonására
de van kiút, valószínűleg megnyitjuk a könyvtárat a csomópontnál (a szálak tetején / libcoro)