Promisiune sau viitor în ruby-concurrency? Când ar trebui să fie folosit care? (Programare, Ruby, Concurrency, Promisiune, Rubygems, Viitor)

toma a intrebat.

În general, promisiunile și funcțiile sunt strâns legate, dacă nu chiar sinonime. În documentația gem-ului https://github.com/ruby-concurrency se spune și așa ceva. Prin urmare, este confuz care dintre ele ar trebui să fie folosită în ce circumstanțe. Și cum sunt ele legate în gem? Este unul de un nivel mai scăzut sau mai învechit decât celălalt? Practic, ambele fac același lucru?

De asemenea, existense de acestea face ca totul să fie și mai confuz:

* Concurrent::Promises.future
* Concurrent::Promises::Future
* Concurrent::Future
* [...possibly something similar...]

Comentarii

  • În readme se spune că Futures sunt depreciate și înlocuite cu Promises… –  > Por max pleaner.
1 răspunsuri
andrykonchin

Pe scurt, Future se referă la execuția asincronă. Este o abstractizare de nivel înalt peste firele de execuție din sistem (Ruby Thread class). Deci, atunci când aveți nevoie să accelerați și să paralelizați unele calcule, atunci trebuie să folosiți fire de execuție. Dar este un fel de lucruri de nivel scăzut, așa că este mai ușor de utilizat Futures în schimb. Unul dintre avantaje este că, de obicei, implementările de Futures utilizează un grup de fire, astfel încât puteți gestiona nivelul de concurență și consumul de resurse de sistem. Așadar, problema pe care Future rezolvă este complexitatea modelului de concurență a firelor de nivel scăzut.

Pe de altă parte Promise se referă la arhitectură și compoziție. Nu este vorba de concurență. Este o abstractizare de nivel înalt asupra callback-urilor și este un subtip al lui Observer model. Permite decuplarea componentei care produce un rezultat și a componentei care consumă acest rezultat. Atât producătorul, cât și consumatorul pot să nu știe nimic unul despre celălalt. Prin urmare, problema care Promise rezolvă este complexitatea și cuplarea pe care le obțineți cu abordarea callback-urilor.

Așadar, în ceea ce privește concurrent-ruby. Acestea oferă ambele versiuni clasice ale Promise și Future. Dar acum oferă și un nou API – Promises (cu s la sfârșit) care pare a fi doar o combinație de promisiuni și futures cu API uniformizată. Aceasta implementează (de fapt, reutilizează) Promise și Future bibliotecile, dar oferă o nouă interfață peste ele. De exemplu, future se comportă similar cu promisiunile și permite înregistrarea de callback-uri și poate fi înlănțuit similar cu promisiunile.

Comentarii

  • de ce promisiunea nu se referă la concurență dacă promisiunea și viitorul sunt practic sinonime? –  > Por toma.
  • Promisiunile ar putea fi utilizate în coduri complet sincrone. Este o modalitate de a organiza callback-urile. –  > Por andrykonchin.