Kako mogu pokrenuti paralelne zadatke u Pythonu

Isprobajte Naš Instrument Za Uklanjanje Problema

Kako mogu pokrenuti paralelne zadatke u Pythonu

Čitajući ovaj dio naučit ćete kako koristiti istodobni.budućnosti knjižnica za pokretanje zadataka asinkrono u Pythonu. To je bolja alternativa za | _+_ | i | _+_ | klase u Pythonu zbog činjenice da je implementirao oba | _+_ | i | _+_ | s istim sučeljem, koje je definirano apstraktom | _+_ | razred. The službena dokumentacija otkriva jedan veliki problem s | _+_ |:

Osim toga, | _+_ | class ne dopušta vraćanje vrijednosti iz funkcija koje se mogu pozvati osim | _+_ |. Glavni koncept | _+_ | modul leži s | _+_ | razred. To je apstraktna klasa koja pruža metode za asinkrono izvršavanje poziva. Umjesto da ga koristimo izravno, koristit ćemo potklase koje ga nasljeđuju:

  • threading
  • multiprocessing

Prijeđimo na sljedeći odjeljak i počnite pisati neki Python kod.



1. ThreadPoolExecutor

Uvoz

Dodajte sljedeću uvoznu deklaraciju na vrh svoje Python datoteke:

Thread

Funkcija koja se može pozvati (cilj)

Definirajmo novu funkciju koja služi kao funkcija koja se može pozivati ​​za asinkroni poziv. Definirat ću jednostavnu funkciju koja spava dvije sekunde i nakon toga vraća množenje oba ulazna parametra:

Process

Pojedinačni zadatak

Sljedeći korak je stvaranje | _+_ | objekt. Preporučuje se umotavanje u | _+_ | context manager, kako će se zvati | _+_ | funkcionirati samostalno i osloboditi resurse nakon dovršetka izvođenja. Prihvaća sljedeće ulazne parametre.

  • | _+_ | - Broj radnika za ovu instancu. Za verziju 3.5 nadalje, prema zadanim će se postavkama broj procesora na stroju pomnožiti s pet. Od verzije 3.8 pa nadalje, zadana vrijednost se mijenja u | _+_ |.
  • | _+_ | - Omogućuje korisnicima da kontroliraju | _+_ | nazive za radničke niti koje je kreiralo spremište radi lakšeg ispravljanja pogrešaka.
  • | _+_ | - Izborni poziv koji se poziva na početku svakog radnog procesa.
  • | _+_ | - Nekoliko argumenata proslijeđenih u | _+_ |.

U ovom vodiču koristit ću samo | _+_ | parametar. Kreirajmo | _+_ | i nazovite | _+_ | funkciju sa | _+_ | kao funkcija pozivanja ulaza. Zapamtite da | _+_ | prihvaća dva ulazna parametra. Proslijedit ću ih kao zasebne parametre umjesto torke:

Executor

| _+_ | funkcija će vratiti | _+_ | objekt koji enkapsulira asinkrono izvršavanje pozivanog. Najčešće korištene funkcije za | _+_ | objekti su:

  • | _+_ | - Pokušaj otkazivanja izvršenja. Vraća logičko polje koje pokazuje je li poziv uspješno otkazan.
  • | _+_ | - Provjerava je li poziv u tijeku. Vraća boolean.
  • | _+_ | - Provjerava je li poziv otkazan ili dovršen. Vraća boolean.
  • | _+_ | - Vraća vrijednost koju je vratio poziv. Ako poziv još nije dovršen, tada će ova metoda pričekati do n sekunde zadane unosom | _+_ | parametar. Toplo se preporučuje provjera pomoću | _+_ | funkciju prije pozivanja rezultata, kao | _+_ | blokirat će trenutno izvršenje.
  • | _+_ | - Dodaje funkciju koja se može pozvati u | _+_ | objekt. Ova funkcija će se pozvati sa | _+_ | kao jedini argument kada | _+_ | se otkazuje ili završava s radom.

Dodajte sljedeći kôd odmah ispod | _+_ | funkcija. To je samo jednostavna petlja koja ispisuje niz dok nit radi. Kad završi, ispisat će rezultat:

Thread

Provjerite cijeli kôd na GitHubu :

threading

Prilikom pokretanja Python datoteke trebali biste vidjeti sljedeći rezultat:

Ovo je naslov slike

Više zadataka

Zatim ćemo mu dodati još jedan zadatak kako bi se oboje paralelno izvodili. Promijenite kôd u Python datoteci na sljedeći:

null

Za sada postavite | _+_ | prvo jednom. Pokrenite ga i trebali biste primijetiti da se zadaci ne izvode paralelno. Pokrenut će prvi zadatak, a zatim drugi zadatak. To je uglavnom zato što u bazenu imate samo jednog radnika. Povećajmo | _+_ | do dva i trebali biste moći vidjeti da se oba zadatka izvode paralelno.

Funkcija povratnog poziva

Možete pridružiti funkciju povratnog poziva | _+_ | objekt. Pozvat će priloženu funkciju nakon što se izvršavanje otkaže ili dovrši. Ovo je izuzetno korisno ako namjeravate nastaviti s ažuriranjem korisničkog sučelja nakon uspješne veze s bazom podataka ili dovršetka URL zahtjeva. Kreirajmo za sada jednostavnu funkciju povratnog poziva:

concurrent.futures

Dodajte sljedeći kôd odmah ispod | _+_ | funkcija:

Executor

Provjerite cijeli kôd na GitHubu :

Sljedeći rezultat bit će prikazan u konzoli kada pokrenete Python datoteku:

ThreadPoolExecutor

Ovo je naslov slike

2. ProcessPoolExecutor

| _+_ | class radi potpuno isto kao i | _+_ |, ali s nekoliko manjih razlika. Koristi | _+_ | modul, koji mu omogućuje zaobilaženje | _+_ |. Međutim, to također znači da se mogu izabrati i vratiti samo objekti koji se mogu birati.

Osim toga, ne radi u interaktivnom prevoditelju i mora imati | _+_ | funkciju koja se može uvoziti pomoću podprocesa radnika. | _+_ | bit će broj procesa u stroju. U operacijskom sustavu Windows, | _+_ | mora biti jednak ili manji od 61.

Morate uvesti | _+_ | koristiti ga:

ProcessPoolExecutor

Prethodni kôd možete ponovno upotrijebiti i promijeniti u | _+_ | umjesto | _+_ |. Umotajte kôd u funkciju i pozovite ga izravno iz | _+_ |. Cijeli kôd provjerite u nastavku na GitHubu :

from concurrent.futures import ThreadPoolExecutor import time

3. Prekid tipkovnice

Ako namjeravate zaustaviti izvršavanje putem | _+_ | dok se proces izvodi u niti, prevoditelj će najvjerojatnije objesiti i zaglaviti na | _+_ | iznimka. To je uglavnom zbog toga što je | _+_ | naredba generira | _+_ |, koja neće zaustaviti ili prekinuti izvršavanje. Morate generirati | _+_ | za prekid izvođenja i povratak na terminal. Upotrijebite sljedeću naredbu za generiranje | _+_ | na temelju operacijskog sustava i modela računala:

Ovo je naslov slike

4. Zaključak

Ponovimo ono što smo danas naučili.

Počeli smo s jednostavnim objašnjenjem | _+_ | modul.

Nakon toga smo dubinski istražili osnovne | _+_ | klase i | _+_ | razred. Pokušali smo pokrenuti više zadataka paralelno s različitim brojem | _+_ |. Također smo testirali postavljanje funkcije povratnog poziva koja će se izvršiti po završetku zadatka.

sql kuharica ili reilly pdf

Prešli smo na | _+_ |, što je slično kao | _+_ | s nekoliko manjih razlika.

Hvala što ste pročitali ovaj članak. Nadam se da se vidimo u sljedećem članku!

#python #data science #devops #async

Vidi Također: