programowanie asynchroniczne w Pythonie
Czy istnieje ogólne pojęcie programowania asynchronicznego w Pythonie? Czy mogę przypisać callback do funkcji, wykonać go i powrócić do głównego przepływu programu natychmiast, bez względu na to, jak długo wykonanie tej funkcji zajmie?
6 answers
Spójrz tutaj:
Programowanie asynchroniczne w Pythonie
Wprowadzenie do programowania asynchronicznego i Twisted
Warto sprawdzić:
Asyncio (poprzednio Tulip) został sprawdzony w domyślnej gałęzi Pythona
14-Mar-2018{[17]]}Dzisiaj Python ma wbudowane asyncio - asynchroniczne We/Wy, pętlę zdarzeń, coroutiny i zadania.
Opis zaczerpnięty z linku powyżej:
Moduł asyncIO zapewnia infrastrukturę do zapisu jednowątkowego kod współbieżny przy użyciu coroutines, multipleksowanie dostępu We/Wy przez gniazda i innych zasobów, uruchamianie klientów sieciowych i serwerów oraz innych spokrewnione prymitywy. Oto bardziej szczegółowa lista pakietu spis treści:
[30]}pętla zdarzeń pluggable z różnymi implementacjami specyficznymi dla systemu; [31]}
- transport i abstrakcje protokołów (podobne do tych w Twisted);
- konkretna obsługa TCP, UDP, SSL, podprocesów, opóźnionych połączeń, i inne (niektóre mogą być zależne od systemu);
- Klasa Przyszłości, która naśladuje tę w równoległym.futures module, ale przystosowany do użycia z pętlą zdarzeń;
- koroutiny i zadania oparte na wydajności z (PEP 380), do pomoc w pisaniu współbieżnego kodu w sekwencyjny sposób;
- wsparcie anulowania kontraktów Futures i coroutines;
- synchronizacja między koroutiny w jednym wątku, naśladując te w moduł gwintowania;
- interfejs do przekazywania pracy do threadpool, w czasach, kiedy absolutnie, pozytywnie trzeba korzystać z biblioteki, która blokuje połączenia We / Wy.
Programowanie asynchroniczne jest bardziej złożone niż klasyczne" sekwencyjne " programowanie: zobacz Develop with asyncio Strona , która wymienia typowe pułapki i wyjaśnia, jak ich unikać. Włącz tryb debugowania podczas tworzenia do wykrywania typowe problemy.
Warto też sprawdzić:
Przewodnik po programowaniu asynchronicznym w Pythonie za pomocą asyncIO
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 23:13:01
To, co opisujesz (główny przepływ programu wznawia się natychmiast podczas wykonywania innej funkcji), nie jest tym, co zwykle nazywa się "programowanie asynchroniczne" (AKA "programowanie sterowane zdarzeniami"), ale raczej "wielozadaniowość" (AKA "wielowątkowość" lub "wieloprocesorowość"). Możesz uzyskać to, co opisałeś za pomocą standardowych modułów bibliotecznych threading
i multiprocessing
(Ten ostatni pozwala na rzeczywiste współbieżne wykonywanie na maszynach wielordzeniowych).
Asynchroniczne (sterowane zdarzeniami) programowanie jest obsługiwane w standardowym Pythonie Biblioteka w modułach asyncore
i asynchat
, które są bardzo zorientowane na zadania sieciowe (rzeczywiście wewnętrznie używają modułu select
, który w Windows obsługuje tylko gniazda - choć w Unixy OSs może również obsługiwać dowolny deskryptor pliku).
Aby uzyskać bardziej ogólne (choć również głównie zorientowane na sieć, ale nie ograniczone do tego) Wsparcie dla programowania asynchronicznego (sterowanego zdarzeniami), sprawdź twisted zewnętrzny pakiet.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-11 00:10:17
Dobra wiadomość dla wszystkich!
Python 3.4 będzie zawierał zupełnie nową, ambitną implementację asynchronicznego programowania !
Obecnie nazywa się tulipan i ma już aktywny po .
Jak opisano w PEP 3153: asynchroniczne wsparcie IO i PEP 3156: asynchroniczne wsparcie IO zrestartowane:
Osoby, które chcą pisać kod asynchroniczny w Pythonie mają teraz kilka opcji:
- asyncore i asynchat;
- coś na zamówienie, najprawdopodobniej oparte na module select;
- korzystanie z bibliotek stron trzecich, takich jak Twisted lub gevent .
Niestety, każda z tych opcji ma swoje wady, które ten PEP próbuje rozwiązać.
Pomimo bycia częścią biblioteki standardowej Pythona przez długi czas, moduł asyncore cierpi na podstawowe wady wynikające z nieelastycznego API, które nie sprostaj oczekiwaniom nowoczesnego modułu sieci asynchronicznej.
Ponadto jego podejście jest zbyt uproszczone, aby zapewnić programistom wszystkie narzędzia, których potrzebują, aby w pełni wykorzystać potencjał asynchronicznej sieci.
Najpopularniejszym obecnie rozwiązaniem wykorzystywanym w produkcji jest korzystanie z bibliotek stron trzecich. Często dostarczają one zadowalających rozwiązań, ale brakuje kompatybilności między tymi bibliotekami, co sprawia, że bazy kodowe bardzo ściśle powiązane z biblioteką, z której korzystają.
Obecny brak możliwości przenoszenia pomiędzy różnymi asynchronicznymi bibliotekami IO powoduje wiele zduplikowanych wysiłków dla zewnętrznych programistów bibliotek. Wystarczająco potężna abstrakcja może oznaczać, że kod asynchroniczny jest pisany raz, ale używany wszędzie.
Oto krótki przegląd jego zdolności.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 09:21:50
Inni respondenci wskazują na Twisted, który jest świetnym i bardzo wszechstronnym frameworkiem, ale moim zdaniem ma bardzo Nie-pythoniczny design. Ponadto, AFAICT, musisz użyć skręconej pętli głównej, co może być dla Ciebie problemem, jeśli używasz już czegoś innego, co zapewnia własną pętlę.
Oto wymyślony przykład, który zademonstruje użycie modułu threading
:
from threading import Thread
def background_stuff():
while True:
print "I am doing some stuff"
t = Thread(target=background_stuff)
t.start()
# Continue doing some other stuff now
Jednak w prawie każdym użytecznym przypadku będziesz chciał komunikować się między nici. Należy przyjrzeć się zasadom synchronizacji i zapoznać się z koncepcją współbieżności i pokrewnymi zagadnieniami.
Moduł threading
zapewnia wiele takich prymitywów do użycia, jeśli wiesz, jak z nich korzystać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-07 14:52:13
Możesz chcieć sprawdzić Twisted library dla Pythona. Zapewniają one wiele przydatnych narzędzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-11 00:09:20
Możesz zobaczyć moje narzędzie do programowania asynchronicznego w Pythonie: http://www.ideawu.com/blog/2010/08/delegate-in-pythonpython-asynchronous-programming.html
import time, random, sys from delegate import * def proc(a): time.sleep(random.random()) return str(a) def proc_callback(handle, args=None): ret = d.end(handle) d = Delegate() d.init(2) # number of workers handle = d.begin(proc, '12345', proc_callback, 'test') sys.stdin.readline() d.free()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 21:30:09