Redux, Thunk i Web Workers

0

To nie jest pytanie o możliwości umieszczenia całego store w web workerze. Natomiast jest to pytanie o to czy web worker można użyć w reducerze, czy jednak raczej w thunku. Wytyczne mówią wyrażnie, że żadnych asynchronicznych w reducerze, ale jest kilka źródeł, które twierdzą, że wielowątkowość to nie asynchroniczność.
Z drugiej strony wytyczne mówią, żeby możliwie dużo logiki trafiał właśnie do reducera.
Ja osobiście na podstawie tego co wyczytałam umieściłabym je raczej w thunku, ale może jednak nie?
Mam na myśli podstawowy web worker, a nie obsługiwany przez comlink.

0

ale jest kilka źródeł, które twierdzą, że wielowątkowość to nie asynchroniczność.

Nie chodzi tylko o asynchroniczność, tylko o brak efektów ubocznych w reducerach, przewidywalność (hasło reduxa brzmi "Redux - A Predictable State Container for JS Apps" - a jeśli odpaliłabyś wątek w reducerze, to on w każdej chwili mógłby jakieś dane wysłać, więc nie byłoby to przewidywalne).

Założenie jest takie, że reducery powinny być czystymi funkcjami, tj. powinny się zachowywać zawsze tak samo (zwracać taką samą wartość dla takich samych argumentów) i nie powinny nic zmieniać, żadnych efektów ubocznych wykonywać. Żeby można było wywołać funkcję choćby i 1000 razy i nic by się nie zmieniło (stąd też wymóg niemutowalności i dlatego reducery nie zmieniają stanu, tylko zwracają nowy)

A jeśli w reducerze byłoby jakieś odpalanie wątków, to po odpaleniu 1000 razy by się odpaliło 1000 wątków, więc nie byłby on już czystą funkcją.

A czystość funkcji się przydaje choćby po to, żeby móc fajnie cofać czas, odtwarzać poprzednie akcje itp. żeby można było zapanować nad zmianami stanu w całej apce (co jest pewną utopią swoją drogą, bo i tak gdzieś te efekty uboczne i nieprzewidywalność musi się znaleźć).

0

ale jest kilka źródeł, które twierdzą, że wielowątkowość to nie asynchroniczność.
Wielowątkowość != asynchroniczność.

Wielowątkowość -
np. odpalasz jakieś zadanie na wielu wątkach, które mogą działać równolegle, ale mogą też wykonywać się asynchronicznie
(np. jeśli procesor ma tylko jedno CPU).

Asynchroniczność -
odpalasz kilka zadań/korutyn na jednym wątku/procesie.
Asynchroniczność sprowadza się do wykonywania jednej akcji na raz, podczas gdy wielowątkowość pozwala na wykonywanie kilku akcji na raz.

A jeśli w reducerze byłoby jakieś odpalanie wątków, to po odpaleniu 1000 razy by się odpaliło 1000 wątków, więc nie byłby on już czystą funkcją.
Jeśli wątki nie zmieniają globalnego stanu, tylko zwracają wartość, wtedy chyba też by wszystko było pure.
W końcu współbieżność to jedna z większych zalet FP.

efekty uboczne i nieprzewidywalność musi się znaleźć
IMHO efety uboczne mogą a nawet powinny być przewidywalne.
Jedyne miejsce na nieprzewidywalność widze w bugach :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1