Python Multiprocessing For-Loop

Python Multiprocessing For Loop



Multitöötlus on võrreldav mitme lõimega töötlemisega. See eristub aga selle poolest, et lõimemiseks kasutatava GIL-i tõttu saame korraga käivitada ainult ühe lõime. Mitmiktöötlus on protsess, mille käigus sooritatakse toiminguid järjest mitmes protsessori tuumas. Lõimesid ei saa paralleelselt kasutada. Kuid mitmetöötlus võimaldab meil luua protsesse ja käitada neid samaaegselt erinevates CPU tuumades. Silmus, näiteks for-loop, on üks kõige sagedamini kasutatavaid skriptikeeli. Korrake sama tööd erinevate andmetega, kuni on saavutatud mingi kriteerium, näiteks etteantud iteratsioonide arv. Silmus sooritab iga iteratsiooni ükshaaval.

Näide 1: For-Loopi kasutamine Pythoni mitmetöötlusmoodulis

Selles näites kasutame for-loop ja Pythoni mitmetöötlusmooduli klassi protsessi. Alustame väga lihtsa näitega, et saaksite kiiresti aru, kuidas Pythoni mitmetöötluse for-loop töötab. Kasutades keermestusmooduliga võrreldavat liidest, pakendab multitöötlus protsesside loomise.







Kasutades lõimede asemel alamprotsesse, pakub mitmetöötluse pakett nii kohalikku kui ka kaugemat samaaegsust, vältides seega globaalset tõlgi lukku. Kasutage jada pidevaks itereerimiseks for-tsüklit, mis võib olla stringobjekt või korteež. See toimib vähem nagu teistes programmeerimiskeeltes nähtud märksõna ja rohkem nagu teistes programmeerimiskeeltes leiduv iteraatorimeetod. Uue multitöötluse käivitamisel saate käivitada for-loopi, mis käivitab protseduuri samaaegselt.



Alustame koodi rakendamisega koodi täitmiseks, kasutades tööriista 'spyder'. Usume, et 'spyder' on ka Pythoni käitamiseks parim. Impordime multitöötlusmooduli protsessi, mille kood töötab. Mitmiktöötlus Pythoni kontseptsioonis, mida nimetatakse 'protsessiklassiks', loob uue Pythoni protsessi, annab sellele koodi täitmise meetodi ja annab põhirakendusele võimaluse täitmist hallata. Klass Process sisaldab protseduure start() ja join(), mis mõlemad on üliolulised.



Järgmisena määratleme kasutaja määratud funktsiooni nimega 'func'. Kuna see on kasutaja määratud funktsioon, anname sellele enda valitud nime. Selle funktsiooni põhiosas anname argumendina edasi muutuja 'subject' ja väärtuse 'matemaatika'. Järgmisena kutsume funktsiooni 'print()', edastades lause 'Üldise subjekti nimi on' ja selle argumendi 'subjekt', mis sisaldab väärtust. Seejärel kasutame järgmises etapis „if name== _main_”, mis takistab teil koodi käivitamist, kui fail imporditakse moodulina, ja lubab teil seda teha ainult siis, kui sisu käivitatakse skriptina.





Tingimuste jaotist, millega alustate, võidakse enamikul juhtudel pidada sisu pakkumiseks, mida tuleks käivitada ainult siis, kui teie fail töötab skriptina. Seejärel kasutame argumendi subjekti ja salvestame sellesse mõned väärtused, milleks on 'teadus', 'inglise keel' ja 'arvuti'. Seejärel antakse protsessile järgmises etapis nimi 'protsess1[]'. Seejärel kasutame protsessi protsessis funktsiooni kutsumiseks „process(target=func)”. Funktsiooni kutsumiseks kasutatakse Target ja me salvestame selle protsessi muutujasse 'P'.

Järgmisena kasutame funktsiooni 'process1' funktsiooni 'append()' kutsumiseks, mis lisab loendi lõppu üksuse, mis meil on funktsioonis 'func'. Kuna protsess on salvestatud muutujas 'P', edastame sellele funktsioonile argumendina 'P'. Lõpuks kasutame protsessi käivitamiseks funktsiooni 'start()' koos 'P'-ga. Pärast seda käivitame meetodi uuesti, esitades argumendi 'subject' ja kasutame teemas 'for'. Seejärel alustame protsessiga, kasutades veel kord 'protsess1' ja 'add()' meetodit. Seejärel protsess käivitub ja väljund tagastatakse. Seejärel kästakse protseduur lõpetada, kasutades “join()” tehnikat. Protsessid, mis ei kutsu protseduuri 'join()', ei välju. Üks oluline punkt on see, et kui soovite protsessi käigus argumente esitada, tuleb kasutada märksõna parameetrit 'args'.




Nüüd näete väljundis, et väide kuvatakse kõigepealt, edastades matemaatika subjekti väärtuse, mille edastame funktsioonile 'func', kuna kutsume seda esmalt funktsiooni 'protsess' abil. Seejärel kasutame käsku 'append()', et saada väärtusi, mis olid juba loendis, mis lisatakse lõppu. Seejärel esitati 'teadus', 'arvuti' ja 'inglise keel'. Kuid nagu näete, pole väärtused õiges järjestuses. Seda seetõttu, et nad teevad seda nii kiiresti kui protseduur on lõppenud ja teatavad oma sõnumist.

Näide 2: järjestikuse for-loopi teisendamine mitmetöötlusega paralleelseks for-loopiks

Selles näites täidetakse mitme töötlusega tsükliülesanne järjestikku, enne kui see teisendatakse paralleelseks silmuse ülesandeks. Jadade (nt kogu või string) vahel saate liikuda nende esinemise järjekorras, kasutades for-tsüklit.

Nüüd alustame koodi juurutamist. Esiteks impordime ajamoodulist 'unerežiimi'. Kasutades ajamoodulis protseduuri 'sleep()', saate kutsuva lõime täitmise nii kauaks peatada, kui soovite. Seejärel kasutame juhuslikust moodulist 'juhuslikku', määratleme funktsiooni nimega 'func' ja edastame märksõna 'argu'. Seejärel loome 'val' abil juhusliku väärtuse ja määrame selle väärtuseks 'juhuslik'. Seejärel blokeerime mõneks perioodiks meetodit 'sleep()' ja edastame parameetrina 'val'. Seejärel käivitame sõnumi edastamiseks meetodi 'print()', edastades parameetrina sõnad 'ready' ja märksõna 'arg', samuti 'created' ja edastame väärtuse 'val' abil.

Lõpuks kasutame 'loputust' ja määrame selle väärtuseks 'True'. Kasutaja saab otsustada, kas väljund puhverdada või mitte, kasutades Pythoni printimisfunktsiooni loputusvalikut. Selle parameetri vaikeväärtus False näitab, et väljundit ei puhverdata. Kui määrate selle väärtuseks Tõene, kuvatakse väljund üksteise järel ridadena. Seejärel kasutame sisenemispunktide turvamiseks käsku 'if nimi== peamine'. Järgmisena teostame töö järjestikku. Siin määrame vahemiku '10', mis tähendab, et tsükkel lõpeb pärast 10 iteratsiooni. Järgmisena kutsume välja funktsiooni 'print()', edastame sellele sisendlause 'valmis' ja kasutame valikut 'flush=True'.


Nüüd näete, et koodi käivitamisel käivitab silmus funktsiooni '10' korda. See kordub 10 korda, alustades indeksist nullist ja lõpetades indeksiga üheksa. Iga sõnum sisaldab ülesande numbrit, mis on funktsiooni number, mille edastame 'arg' ja loomise numbrina.


See järjestikune tsükkel muudetakse nüüd mitmetöötlusega paralleelseks for-tsükliks. Kasutame sama koodi, kuid kasutame mitmetöötluse jaoks täiendavaid teeke ja funktsioone. Seetõttu peame importima protsessi multitöötlusest, nagu me varem selgitasime. Järgmisena loome funktsiooni nimega 'func' ja edastame märksõna 'arg', enne kui kasutame juhusliku arvu saamiseks 'val=random'.

Seejärel kasutame pärast meetodi print() käivitamist sõnumi kuvamiseks ja parameetri 'val' andmist, et viivitada veidi, kasutame sisenemispunktide kaitsmiseks funktsiooni 'if name = main'. Seejärel loome protsessi ja kutsume protsessis oleva funktsiooni 'process' abil ja edastame 'target=func'. Seejärel edastame 'func', 'arg', edastame väärtuse 'm' ja vahemiku '10' läbimine, mis tähendab, et tsükkel lõpetab funktsiooni pärast '10' iteratsiooni. Seejärel alustame protsessi, kasutades meetodit 'start()' ja 'protsess'. Seejärel kutsume välja meetodi 'join()', et oodata protsessi täitmist ja pärast seda kogu protsess lõpule viia.


Seetõttu kutsuvad funktsioonid koodi täitmisel põhiprotsessi ja alustavad nende täitmist. Neid tehakse aga seni, kuni kõik ülesanded on täidetud. Näeme seda, kuna iga ülesannet täidetakse samaaegselt. See teatab oma sõnumist niipea, kui see on lõpetatud. See tähendab, et kuigi sõnumid on korrast ära, lõpeb tsükkel pärast kõigi '10' iteratsiooni lõpetamist.

Järeldus

Selles artiklis käsitlesime Pythoni mitmetöötluse for-loopi. Esitasime ka kaks illustratsiooni. Esimene illustratsioon näitab, kuidas kasutada Pythoni silmuse mitmiktöötlusteegis for-loopi. Ja teine ​​illustratsioon näitab, kuidas muuta järjestikune for-silmus paralleelseks mitmetöötlusega for-tsükliks. Enne Pythoni multitöötluse skripti koostamist peame importima multitöötlusmooduli.