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:
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
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:
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:
- Kako se rugati GraphQL API-ima s json-graphql-poslužiteljem
- Hyper V vs VMware VS VirtualBox: Što je najbolje za sastanke s Virtualizat
- Vanjske tablice SQL Server PolyBase s Azure Blob Storage
- Waldo Anticheat: Strojno učenje za otkrivanje ciljanja u videoisječcima
- Izradite decentralizirani protokol razmjene poput PancakeSwap -a na pametnom lancu Binance