2013-05-15 17 views
11

Ja zapytałem powiązane pytanie przed Why OCaml's threading is considered as `not enough`?Jakie biblioteki należy użyć, aby uzyskać lepszą obróbkę OCaml?

Nieważne jak nawlekanie „zły” SML jest, zauważyłem niektóre biblioteki powiedzieć można zrobić prawdziwe wątków.

Na przykład Dwójki

Dwójki oferuje nową alternatywę. Zapewnia bardzo lekkie, wspólne nitki; "uruchamianie" wątku jest bardzo szybką operacją, nie wymaga nowego stosu, nowego procesu ani niczego innego. Ponadto przełączniki kontekstu są bardzo szybkie. W rzeczywistości jest tak łatwo, że uruchomimy wątek dla każdego wywołania systemowego. Komponowanie wątków współpracujących pozwoli nam pisać wysoce asynchroniczne programy .

także zapewnia Jane Street „s aync_core również podobne rzeczy, jeśli mam rację.


Ale jestem bardzo zdezorientowany. Czy Lwt lub aync_core udostępniają wątki takie jak Java threading?

Jeśli używam ich, czy mogę korzystać z wielu procesorów?

W jaki sposób mogę uzyskać "prawdziwy wątek" (podobnie jak w Javie) w OCaml?


Edit

nadal jestem zdezorientowany.

Dodam scenariusz:

Mam serwer (16 cpu cores) oraz aplikacji serwera.

Co robi aplikacja serwera to:

  • on słucha żąda
  • Dla każdego żądania, zaczyna obliczeniowej zadania (powiedzmy kosztuje 2 minuty do mety)
  • Kiedy każde zadanie zakończy, zadaniem będzie albo zwrócić wynik z powrotem do głównego lub po prostu wysłać wynik z powrotem do klienta bezpośrednio

W Javie jest to bardzo łatwe. Tworzę pulę wątków, a następnie dla każdego żądania utworzę wątek w tej puli. ten wątek uruchomi zadanie obliczeniowe. To jest dojrzałe w Javie i może wykorzystywać 16 rdzeni procesorów. Czy mam rację?

Moje pytanie brzmi: czy mogę zrobić to samo w OCaml?

+0

Uważam, że powinno być możliwe wykorzystanie urządzeń gwintujących JVM z portem ocaml do tej platformy, ale jeszcze tego nie próbowałem. – didierc

Odpowiedz

16

Przykład równoległego serwera, który cytujesz, jest jednym z tych zawstydzająco równoległych problemów, które są dobrze rozwiązywane za pomocą prostego modelu wieloprocesowego, przy użyciu fork. To było możliwe w OCaml od dziesięcioleci, i tak, będziesz prawie liniowo przyspieszać używając wszystkich rdzeni twojego komputera, jeśli potrzebujesz.

Aby to zrobić, korzystając z prostych prymitywów z biblioteki standardowej, patrz this Chapter książki online „programowania systemu Unix w SML” (wydany w 2003) i/lub this chapter książki on-line „Tworzenie aplikacji z SML” (po raz pierwszy wydany w 2000 r.).

Możesz także chcieć używać bibliotek wyższego poziomu, takich jak biblioteka Gerda Stolpmanna o nazwie OCamlnet wspomniana przez firmę Rafix, która dostarcza wiele rzeczy od bezpośredniego pomocnika do zwykłego projektu klient/serwer, do niskopoziomowych bibliotek komunikacji wieloprocesowej; patrz the documentation.

Biblioteka jest również interesująca, ale może dla nieco innego przypadku użycia (jest więcej, że masz cały szereg dostępnych jednocześnie danych, które chcesz przetwarzać równolegle z tą samą funkcją): a zamiana kropli Array.map lub List.map (lub fold), która jest równoległa do obliczeń.

+0

OK, więc jeśli możemy użyć 'fork' w tego rodzaju scenariuszu, dlaczego istnieje' lwt' lub 'async_core'? Mam na myśli jakie są różnice między nimi a "widelcem"? Czy włączone jest wielordzeniowe 'lwt' lub' async_core'? –

+2

Jackson odpowiedziałem na ostatnie pytanie już – rgrinberg

+0

@rgrinberg Byłem zdezorientowany twoją odpowiedzią, przepraszam, może to dlatego, że naprawdę nie rozumiem, co jest teraz "wątkiem". Z mojego zrozumienia ze świata Javy narodził się 'threading' z możliwością wykorzystania multi-cpu. Ale z twojej odpowiedzi lub z tego, co przeczytałem do tej pory, niektóre dokumenty nie są. –

11

Najbliższą rzeczą, którą można znaleźć w rzeczywistym (prewencyjnym) wątku, jest wbudowana biblioteka wątków.Rozumiem przez to, że twój model programowania będzie taki sam, ale z 2 ważnymi różnicami:

  • Natywne wątki OCamla nie są lekkie jak Java.
  • Tylko jeden wątek wykonuje się na raz, więc nie można korzystać z wielu procesów.

Powoduje to, że wątki OCaml są całkiem złym rozwiązaniem zarówno dla współbieżności, jak i równoległości, więc generalnie ludzie unikają ich używania. Ale nadal mają swoje zastosowania.

Lwt i Async są bardzo podobne i zapewniają inny smak gwintowania - kooperatywny styl. Wątki współpracy różnią się od uprzedzających w tym, że przełączanie kontekstowe między wątkami jest jawne w kodzie, a wywołania blokujące są zawsze widoczne z sygnatury typu. Oferowane przez nas wątki współpracy są bardzo tanie, więc bardzo dobrze nadają się do współbieżności, ale znowu nie pomogą ci z równoległością (ze względu na ograniczenia środowiska uruchomieniowego OCaml).

Zobacz to na dobre wprowadzenie do spółdzielni gwintowania: http://janestreet.github.io/guide-async.html

EDIT: dla danego scenariusza użyłbym Parmap, jeśli zadania są tak obliczeniowo jak w przykładzie następnie napowietrznej rozpoczęciem procesów z parmap powinny być znikome.

+0

Więc nie ma sposobu na wykorzystanie wielu procesorów? –

+0

@Jackson: Możesz użyć wielu procesów. Dostępna jest biblioteka ułatwiająca: [parmap] (http://rdicosmo.github.io/parmap/), [nproc] (https://github.com/MyLifeLabs/nproc), [net-multicore ] (http://blog.camlcity.org/blog/multicore3.html) Ale oczywiście to nie to samo co równoległe działające wątki. – rafix

+2

Aby dodać do komentarza firmy Rafix: jedyny czas, w którym wkręcasz się, to sytuacja, w której potrzebujesz szybkiej, zmiennej pamięci współdzielonej między procesami. – rgrinberg

Powiązane problemy