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?

Author: p.campbell, 2010-07-11

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]}
  1. transport i abstrakcje protokołów (podobne do tych w Twisted);
  2. konkretna obsługa TCP, UDP, SSL, podprocesów, opóźnionych połączeń, i inne (niektóre mogą być zależne od systemu);
  3. Klasa Przyszłości, która naśladuje tę w równoległym.futures module, ale przystosowany do użycia z pętlą zdarzeń;
  4. koroutiny i zadania oparte na wydajności z (PEP 380), do pomoc w pisaniu współbieżnego kodu w sekwencyjny sposób;
  5. wsparcie anulowania kontraktów Futures i coroutines;
  6. synchronizacja między koroutiny w jednym wątku, naśladując te w moduł gwintowania;
  7. 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

 33
Author: Leniel Maccaferri,
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.

 56
Author: Alex Martelli,
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.

 19
Author: Ivan Kharlamov,
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ć.

 13
Author: Jesse Dhillon,
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.

  1. mały podkład
  2. Defer i pokrewne rzeczy
 3
Author: Aiden Bell,
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()
 1
Author: ideawu,
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