(Dawno temu) napisałem pająka sieciowego, który wielowątkowo, aby umożliwić jednoczesne występowanie w tym samym czasie. Tak było w mojej młodości w Pythonie, w czasach, kiedy wiedziałem o GIL i związanych z nim nieszczęściach dla wielowątkowego kodu (IE, w większości przypadków rzeczy są po prostu serializowane!) ...
Chciałbym przerobić ten kod, aby był bardziej niezawodny i działał lepiej. Są w zasadzie dwa sposoby, aby to zrobić: mógłbym użyć nowego modułu wieloprocesowego w wersji 2.6+ lub wybrać jakiś model oparty na reaktorze / zdarzeniu. Wolę zrobić później, ponieważ jest to o wiele prostsze i mniej podatne na błędy.
Pytanie dotyczy więc tego, jakie ramy najlepiej pasowałyby do moich potrzeb. Poniżej znajduje się lista znanych mi opcji:
- Twisted : Dziadek struktur reaktorów Pythona: wydaje się złożony i nieco rozdęty. Stroma krzywa uczenia się dla małego zadania.
- Eventlet : Od facetów z Lindenlab . Ramy oparte na Greenlet ukierunkowane na tego rodzaju zadania. Spojrzałem jednak na kod i nie jest zbyt ładny: niezgodny z Pep8, rozrzucony wydrukami (dlaczego ludzie robią to w ramach !?), API wydaje się trochę niespójne.
- PyEv : Niedojrzały, nie wydaje się, żeby ktoś go teraz używał, chociaż jest oparty na libevent, więc ma solidny backend.
- asyncore : Z poziomu niskiego poziomu stdlib: über, wydaje się, że dużo pracy nóg wymaga tylko zrobienia czegoś z ziemi.
- tornado : Chociaż jest to produkt zorientowany na serwer, przeznaczony do dynamicznych serwerów internetowych, zawiera on asynchronicznego klienta HTTP i prosty ioloop . Wygląda na to, że może to zrobić zadanie, ale nie do tego, do czego było przeznaczone. [edytuj: niestety nie działa w systemie Windows, co dla mnie się liczy - jest to wymagane, aby obsługiwać tę kiepską platformę]
Czy w ogóle coś mi umknęło? Z pewnością musi istnieć biblioteka, która pasuje do najprostszej biblioteki uproszczonej sieci asynchronicznej!
[edytuj: wielkie podziękowania dla intgr za jego wskaźnik do tej strony . Jeśli przewiniesz do dołu, zobaczysz naprawdę fajną listę projektów, które mają na celu sprostanie temu zadaniu w taki czy inny sposób. Wydaje się, że w rzeczywistości rzeczy potoczyły się od momentu powstania Twisted: ludzie wydają się teraz preferować rozwiązanie oparte na wspólnej procedurze , a nie tradycyjne rozwiązanie zorientowane na reaktor / oddzwanianie. Korzyści z tego podejścia są wyraźniejsze, bardziej bezpośredni kod: z pewnością znalazłem w przeszłości, szczególnie podczas pracy z boost.asiow C ++ ten kod oparty na wywołaniu zwrotnym może prowadzić do projektów trudnych do naśladowania i stosunkowo mało widocznych dla niewprawnego oka. Korzystanie z procedur wspólnych pozwala pisać kod, który wygląda trochę bardziej synchronicznie. Wydaje mi się, że teraz moim zadaniem jest ustalenie, której z tych wielu bibliotek lubię wyglądać i spróbować! Cieszę się, że zapytałem teraz ...]
[edytuj: być może zainteresuje każdego, kto podążył za tym pytaniem lub natknął się na to pytanie lub w jakikolwiek sposób troszczy się o ten temat: Znalazłem naprawdę świetny opis aktualnego stanu dostępnych narzędzi do tego zadania]
select
do multipleksowania I / O. Ale powinieneś być w stanie uzyskać z tego przyzwoitą wydajność dzięki tornado-pyuv . 2. Istnieje obecnie asyncio w Pythonie 3.3+ i jego backportu trollius który pozwala uruchomić dowolną aplikację Tornado w pętli zdarzeń (Twisted wspierane będą wkrótce).