Cum să întrerupeți execuția unei funcții asincrone din exterior

> Necesitatea de a întrerupe execuția poate intra într-un somn lung și o operațiune de rețea lungă

Nu se poate, că este punctul de noduri (sau chiar libev), care toate IO-operare delegate către un alt fir în fluxul de „noduri de calcul“, de fapt, sunt doar kalbeki (explicite, inclusiv cronometre, și implicit).







> Verificarea constantă a pavilionului înainte ca fiecare să aștepte să ucidă toată eleganța soluției

Într-un alt mod, nu, pentru că nimeni altcineva nu va fi în măsură să verifice necesitatea de oprire, Noda (sau V8) un singur fir, și în multe de calcul funcția „continuă“ nu va fi în măsură să intervină chiar și o tratare a evenimentului (de exemplu, printr-un semnal de la IO sau worker`s învecinate).

Dacă aveți nevoie de mult timp, dar întrerupt de calcul, să le prezinte la un lucrător (cu ajutorul modulului de cluster, de exemplu), și ucide un lucrător, dacă este necesar (reconstrui).

Dark Hole. încercați, de asemenea, în C + + pentru a înțelege ce este programarea multi-threaded, mutexuri, secțiuni critice, semaphore. Apoi, o altă încercare sau Smalltolk Erlang, încercați să înțeleagă alt model actor paradigmă multitasking, de exemplu. Și se întoarce programul Nodului cu dragoste, mai degrabă decât numindu-i cârje pentru că odată ce unii scolarul a spus acest lucru, după ce a eșuat în cap pentru a se potrivi mai mult de două abordări pentru rezolvarea unei probleme abstracte :).

napa3um. vă spun despre ce gunoi, ceea ce face „nu se poate“, în exemplul de mai sus este pus în aplicare prin intermediul sleep timer + PROMIS. Acum, imaginați-vă că, în funcția de async, te-ai dus la culcare timp de 60 de secunde, iar în fluxul principal (sau dintr-o altă funcție asincronă), va trebui să avorteze funcția asin și curăța gunoiul?

Mikhail Yurievich. A răspuns deja la întrebarea dvs. Dacă funcția calculează continuu ceva, atunci nu va fi posibil să o opriți din același fir, deoarece există doar această funcție este evaluată (chiar și pe kalbeki IO-evenimente sau evenimente timer nu pot fi executate în cazul în care funcția nu este, în sine, orice operații asincrone). În acest caz, singura modalitate de a întrerupe calculele este de a le duce la vorker și de a forța forajul, dacă este necesar. Dacă funcția nu calculează nimic, și numai de așteptare pentru evenimentul de timer-ul (în cronometre nod nu sunt flux congelat, dar numai provoca kalbeki la un moment dat), apoi pentru a anula executarea acestei așteptare este suficient pentru a distruge clearTimeout funcția temporizator apel. Nu ezitati sa inteles gresit ceva, modelul de execuție asincron - nu o astfel de temă simplă și necesită nu doar teorie, ci, de asemenea, practica de a „înțelegere iluminați“ :).







napa3um. vă mulțumesc pentru clarificare! acum sunt cu siguranta iluminat. Apoi am văzut că nu este necesar să se continue discuția cu tine :), deși mi-ar putea ilumineze, și oferă o soluție frumoasă ca o funcție de întrerupere în cazul în care asincronă 5 decalări între 5 și tcp conexiuni. Dar, te rog, nu se rostogolească în jos pentru calculele lor un muncitor si grele, care de fapt nu este

„Soluție Nisa ca funcția asincrone anulare în care 5 alunecările și între 5 conexiuni tcp“ - pentru a distruge timer-ul, care creează dvs. „alunecare“ (salvați timer-ul creat în snooze, în aceeași variabilă externă asociată cu o anumită funcție, care doriți să "întrerupeți" și apoi să apelați ClearTimeout atunci când doriți să întrerupeți funcția). Dacă nu doriți să întoarceți boilerele.

în acest caz aveți o astfel de abordare fundamental greșită ar trebui să fie un super computer și un cluster care să vă ajute.
Schimbați modul de abordare, face principiul evenimentului Bucla (cum ar fi Nginx face, la fel ca în-nod pe bază), atunci nu va avea nevoie de somn, și a lucrătorilor asincron se vor primi semnalele necesare. Starea 10k (nu operațiunile) poate fi întreținută cu mai mulți muncitori, fără a afecta performanța hardware-ului. Nu trebuie să uităm că, în realitate, doar o singură operație se realizează pe CPU, doar trebuie să țină evidența statului și nimeni nu deranjează să se amestece în starea semnalului de întrerupere, semnalul să treacă printr-o sută sau buclă-s două și m. Uită-te atent la metoda "programării reactive" (RxJS). În același timp, rezolva problema, care nu a avut încă timp pentru a reflecta - organizația distribuită „citire-scriere“: pentru a furniza procese 10k de date, va trebui să „trage“ fluxul de date din fluxul și apoi „trage“ datele pentru fiecare dintre procesele. Nu este greu de ghicit că fiecare proces trebuie să ia ceva undeva și să genereze date care trebuie adăugate undeva. Pentru aceasta, nu aveți nevoie de 2 × 10k procese?

Nu aveți "harul soluției", pentru că nu există o soluție ca atare :(

Pentru a nu rupe creierul despre Rx - aici este patul

Încă de acum 25 de ani, profesorii de programare au spus că utilizarea tranzițiilor directe și a funcțiilor noop (somn) înseamnă doar că nu știți cum să programați. Și în primul rând - setați corect sarcina și alegeți modul corect de rezolvare.

puteți continua să încerce să-i spuneți experiența în php, pentru a învăța și de a instrui pe alții, dar, te rog, dacă nu aveți o decizie cu privire la obiectul (abandona funcția asincronă în afara) - trec, nu arată incompetența lor

la lectură: korutiny, fire verzi, iată un exemplu de la python / gevent www.gevent.org/gevent.html (metoda kill)
anulare (anulare / ucidere / aruncare) este pusă în aplicare într-o formă sau alta în toate bibliotecile normale, de exemplu, în același Bluebird: bluebirdjs.com/docs/api/cancellation.html - dar este o carja, deoarece trebuie să specificăm un apel de anulare pentru fiecare operație care ne interesează

răspunzând la propria întrebare din primul mesaj - în momentul de față în specificațiile JS nu există niciun mecanism care să anuleze funcția asincronă
dar există o cale de ieșire, este posibil să deschidem biblioteca pentru nod (pe partea de sus a fibrelor / libcoro)







Trimiteți-le prietenilor: