2015-04-22 11 views
18

O ile rozumiem już libgreen is not a part of Rust standard library. Również nie mogę znaleźć oddzielnego pakietu libgreen. Istnieje kilka alternatyw - coroutine, które obecnie nie zapewniają rzeczywistych zielonych wątków, oraz green-rs, która jest zepsuta. Czy dobrze rozumiem, że na razie nie ma lekkich procesów typu Go w Rust?Co stało się z libgreen?

+3

Kilka innych powiązanych rzeczy: [threadpool] (https://crates.io/crates/threadpool), [mio] (https://github.com/carllerche/mio). –

+2

Oddanie komentarza Chrisa: nie ma jednego uniwersalnego rozwiązania, jeśli chodzi o zielono-nici, więc musisz wybrać kompromis. –

Odpowiedz

14

Masz rację, że nie ma lekka biblioteka wielozadaniowość w std (lub reszta głównej dystrybucji), który green nie kompiluje i że coroutine nie wydaje się, aby w pełni obsłużyć jeszcze aspekt wątków. Nie znam żadnej innej biblioteki w tej przestrzeni.

Co się stało: dokument RFC powiązany z tym numerem — RFC 230 — jest kanonicznym źródłem informacji. Podsumowując, stwierdzono, że metoda, według której przetwarzano zielone wątki/IO (std, próbowała streścić w obu modelach, umożliwiając ich współdziałanie w sposób automatyczny) nie była warta wad. Teraz, std ma na celu zapewnienie minimalnej linii bazowej użytecznego wsparcia: dla IO/threading oznacza to "cienkie", bezpieczne opakowania dla funkcjonalności systemu operacyjnego.

9

Przeczytaj ten https://aturon.github.io/blog/2016/08/11/futures/ a także:

Steve Klabnik's response w komentarzach:

Na początku Rust miał tylko zielone wątki. Ostatecznie to zdecydował, że język systemu bez wątków systemowych jest ... dziwny. Więc musieliśmy je dodać. Dlaczego nie dodać wyboru? Ponieważ interfejsy mogą być takie same, dlaczego nie abstrakcyjne nad nimi, a mógłbyś tylko wybrać, który chciałeś?

W tym samym czasie problemy z zielonymi wątkami były domyślnie numerami . Segmentowane stosy spowalniają interakcję C. Do ich zarządzania potrzebne jest środowisko wykonawcze . Ponadto ogólna abstrakcja to , co powoduje niedopuszczalne koszty. Zielone nitki nie były bardzo zielone. Plus, z koniecznością wypuszczenia w przyszłości pewnego dnia, decyzje należy wprowadzić w odniesieniu do kompromisów. A ponieważ Rust ma być , być językiem systemowym, mając wątki 1: 1 i w zasadzie brak runtime ma więcej sensu niż wątki N: M i środowisko wykonawcze. . Więc libgreen został usunięty , interfejs został ponownie zrobiony, aby był koncentryczny na wątku 1: 1.


"Wydanie pewnego dnia nadejdzie" to duża część tego. Chcemy być naprawdę stabilni w Rust i ze wszystkimi rzeczami, które powinniśmy zrobić, aby faktycznie wysłać do nas 1., nie chcieliśmy krystalizować interfejsu, z którym nie byliśmy zadowoleni. Heck, wyciągnęliśmy wiele bibliotek, które są jeszcze mniej ważne z podobnych powodów, jak rand. Inżynieria to kompromisy w zakresie i zdecydowaliśmy się wybrać minimalizm.

mio to nie rozrusznik dla nas, podobnie jak większość innych ram asynchroniczne I/O dla Rust, ponieważ musimy Windows i poza nie chcemy zostać zablokowane w drogim zastąpić bibliotekę, która może zostać osierocony .

Totally understand here, szczególnie w ogólnym przypadku. W konkretnym przypadku, mio ​​będzie albo mieć wsparcie dla Windows, albo wydana zostanie specyficzna dla systemu Windows wersja mio, , z pakietem wyższego poziomu zapewniającym funkcje dla wszystkich platform. W tym przypadku jest on obsługiwany przez jedną z osób, które obecnie używają Rust w produkcji, więc prawdopodobnie nie zniknie w najbliższym czasie . Ale jeśli nie jesteś aktywnie zaangażowany, trudno jest o takich rzeczach wiedzieć, co samo w sobie jest problemem.

Jednym z powodów, dla których wygodnie usuwaliśmy libgreen, jest to, że możesz pisać własne biblioteki, aby wykonywać różne rodzaje operacji wejścia/wyjścia. 1.0 jest silnym rdzeniem, które dobrze nam się stabilizuje na zawsze, a nie ostatecznym bitem . Biblioteki takie jak https://github.com/carllerche/mio mogą przetestować różne sposoby obsługi rzeczy takich jak asynchroniczne IO, a gdy są wystarczająco dojrzałe, zawsze możemy je pobrać z powrotem do standardowej biblioteki, jeśli jest to konieczne. Ale w międzyczasie, to tylko jeden wiersz do Cargo.toml do dodać je do

i taki tekst z reddit.

Niestety skończyło się konserw z Greenlet wsparcia, ponieważ oni byli wolniej niż wątki jądra, co z kolei demonstruje, że ktoś nie rozumiał, jak uzyskać kompilator językowy do generowania skutecznych coroutines (nie zaskakując, liczba inżynierów podłączonych we właściwy sposób jest niewielka na tym świecie, ale zobacz http://www.reddit.com/r/rust/comments/2l0a4b/do_rust_web_servers_use_libuv_through_libgreen_or/ , aby uzyskać więcej szczegółów). I zachowywali asynchroniczne i/o, ponieważ libuv jest "wolny" (który jest tylko dlatego, że jest tylko jeden gwintowany, plus wymusza malloc + wolny na operację asynchroniczną, ponieważ bufory muszą trwać aż do zakończenia, plus to wymusza kara ponad synchronicznego i/o patrz http://blog.kazuhooku.com/2014/09/the-reasons-why-i-stopped-using-libuv.html) który był prawdziwy wstyd - powinny one miały możliwość zastąpić libuv coś lepszego (wskazówka: ASIO + afio, i tak wiem są zarówno C++, ale Rust mógł zrobić z dużo lepszym interakcją w C++ niż , której obecnie nie ma) zamiast z puszką zawsze asynchronizuje wszystko w czymś, co mogło być niesamowitym krokiem w górę z C++ z większością t korzyści Erlang bez wad z Erlang.

+0

Również "* jednym z powodów, dla których wygodnie usuwaliśmy libgreen, jest to, że możesz pisać własne biblioteki, aby robić różne rodzaje IO *" (ten sam link). Podobnie jak w C++, (zielony) wątek może być najpierw zaimplementowany jako biblioteka. – ArtemGr

+3

Zostawiłem kilka uwag na ten temat, myślę, że jest to niepełna perspektywa. –

+0

dzięki za wyjaśnienia – rofrol

0

Dla nowo przybyłych, jest teraz may, paka, który implementuje zielone wątki podobne do goroutines.

Powiązane problemy