Python Multiprocessing For-Loop

Python Multiprocessing For Loop



Daugiasluoksnis apdorojimas yra panašus į kelių gijų apdorojimą. Tačiau jis skiriasi tuo, kad vienu metu galime vykdyti tik vieną giją dėl GIL, kuris naudojamas sriegimui. Daugiafunkcis apdorojimas tai procesas, kai nuosekliai atliekamos operacijos keliuose procesoriaus branduoliuose. Siūlai negali būti naudojami lygiagrečiai. Tačiau daugybinis apdorojimas leidžia nustatyti procesus ir vienu metu juos vykdyti įvairiuose procesoriaus branduoliuose. Ciklas, pvz., for-ciklas, yra viena iš dažniausiai naudojamų scenarijų kalbų. Kartokite tą patį darbą naudodami įvairius duomenis, kol pasieksite kriterijų, pvz., iš anksto nustatytą pakartojimų skaičių. Ciklas kiekvieną iteraciją atlieka po vieną.

1 pavyzdys: For-Loop naudojimas Python kelių apdorojimo modulyje

Šiame pavyzdyje mes naudojame for-loop ir Python kelių apdorojimo modulių klasės procesą. Pradedame nuo labai paprasto pavyzdžio, kad galėtumėte greitai suprasti, kaip veikia Python kelių apdorojimo ciklas. Naudojant sąsają, panašią į sriegimo modulį, daugiafunkcinis apdorojimas pakuoja procesų kūrimą.







Naudodamas antrinius procesus, o ne gijas, kelių apdorojimo paketas užtikrina tiek vietinį, tiek tolimą lygiagretumą, taip išvengiant visuotinio vertėjo užrakto. Norėdami nuolat kartoti seką, naudokite for-ciklą, kuris gali būti eilutės objektas arba eilė. Tai veikia mažiau kaip raktinis žodis, matomas kitose programavimo kalbose, ir labiau kaip iteratoriaus metodas, randamas kitose programavimo kalbose. Pradėję naują daugiafunkcinį apdorojimą, galite paleisti for-ciklą, kuris vienu metu vykdo procedūrą.



Pradėkime įdiegdami kodo vykdymo kodą naudodami „spyder“ įrankį. Manome, kad „spyder“ taip pat yra geriausias „Python“ paleidimui. Importuojame kelių procesų modulio procesą, kuriame veikia kodas. Daugiafunkcis apdorojimas Python sąvokoje, vadinamas „procesų klase“, sukuria naują Python procesą, suteikia jam kodo vykdymo metodą ir suteikia pagrindinei programai būdą valdyti vykdymą. Proceso klasėje yra start() ir join() procedūros, kurios abi yra labai svarbios.



Toliau apibrėžiame vartotojo apibrėžtą funkciją, vadinamą „func“. Kadangi tai yra vartotojo apibrėžta funkcija, suteikiame jai savo pasirinktą pavadinimą. Šios funkcijos turinyje kaip argumentą perduodame kintamąjį „subject“ ir „matematikos“ reikšmę. Toliau iškviečiame funkciją „print()“, perduodant teiginį „Bendrojo dalyko pavadinimas yra“, taip pat jo argumentą „subject“, kuriame yra reikšmė. Tada sekančiame veiksme naudojame „if name== _main_“, kuris neleidžia paleisti kodo, kai failas importuojamas kaip modulis, ir leidžia tai padaryti tik tada, kai turinys vykdomas kaip scenarijus.





Sąlygų skiltis, nuo kurios pradedate, daugeliu atvejų gali būti laikoma vieta, kurioje pateikiamas turinys, kuris turėtų būti vykdomas tik tada, kai failas veikia kaip scenarijus. Tada naudojame argumento temą ir jame saugome kai kurias reikšmes, kurios yra „mokslas“, „anglų kalba“ ir „kompiuteris“. Tada kitame veiksme procesui suteikiamas pavadinimas „process1[]“. Tada mes naudojame „process(target=func)“, kad iškviestume funkciją procese. „Target“ naudojamas funkcijai iškviesti, o šį procesą išsaugome „P“ kintamajame.

Tada mes naudojame „process1“, kad iškviestume funkciją „append()“, kuri prideda elementą sąrašo pabaigoje, kurį turime funkcijoje „func“. Kadangi procesas yra saugomas „P“ kintamajame, šiai funkcijai kaip argumentą perduodame „P“. Galiausiai, norėdami pradėti procesą, naudojame funkciją „start()“ su „P“. Po to dar kartą paleidžiame metodą, pateikdami argumentą „subject“ ir temoje naudojame „for“. Tada dar kartą naudodami „process1“ ir „add()“ metodus, pradedame procesą. Tada procesas vykdomas ir išvestis grąžinama. Tada procedūra nurodoma baigti naudojant „join()“ techniką. Procesai, kurie neiškviečia „join()“ procedūros, nebus baigti. Vienas iš esminių dalykų yra tai, kad raktinio žodžio parametras „args“ turi būti naudojamas, jei proceso metu norite pateikti kokių nors argumentų.




Dabar išvestyje galite pamatyti, kad teiginys pirmiausia rodomas perduodant „matematikos“ dalyko reikšmę, kurią perduodame funkcijai „func“, nes pirmiausia ją vadiname naudodami funkciją „procesas“. Tada mes naudojame komandą „append()“, kad gautume reikšmes, kurios jau buvo sąraše, kuris pridedamas pabaigoje. Tada buvo pristatyti „mokslas“, „kompiuteris“ ir „anglų kalba“. Tačiau, kaip matote, reikšmės nėra teisinga seka. Taip yra todėl, kad jie tai padaro iš karto, kai baigiasi procedūra, ir praneša apie savo pranešimą.

2 pavyzdys: nuoseklios For-Loop konvertavimas į daugiaprocesį lygiagrečią For-Loop

Šiame pavyzdyje kelių apdorojimo ciklo užduotis vykdoma nuosekliai prieš konvertuojant į lygiagrečią ciklo užduotį. Galite pereiti per sekas, pvz., rinkinį ar eilutę, tokia tvarka, kokia jos atsiranda, naudodami kilpas.

Dabar pradėkime diegti kodą. Pirmiausia importuojame „miegą“ iš laiko modulio. Naudodami „sleep()“ procedūrą laiko modulyje, galite sustabdyti iškvietimo gijos vykdymą tiek, kiek norite. Tada mes naudojame „atsitiktinį“ iš atsitiktinio modulio, apibrėžiame funkciją pavadinimu „func“ ir perduodame raktinį žodį „argu“. Tada mes sukuriame atsitiktinę reikšmę naudodami „val“ ir nustatome ją į „atsitiktinis“. Tada trumpam blokuojame naudodami „sleep()“ metodą ir perduodame „val“ kaip parametrą. Tada, norėdami perduoti pranešimą, paleidžiame metodą „print()“, kaip parametrą perduodame žodžius „ready“ ir raktinį žodį „arg“, taip pat „created“ ir perduodame reikšmę naudodami „val“.

Galiausiai mes naudojame „flush“ ir nustatome jį į „True“. Vartotojas gali nuspręsti, ar išsaugoti išvestį buferyje, naudodamas Python spausdinimo funkcijos praplovimo parinktį. Numatytoji šio parametro reikšmė False rodo, kad išvestis nebus buferyje. Išvestis rodoma kaip eilučių, einančių viena po kitos, serija, jei ją nustatote kaip „true“. Tada mes naudojame „if name== main“, kad apsaugotume įėjimo taškus. Toliau darbą atliekame nuosekliai. Čia mes nustatome diapazoną į „10“, o tai reiškia, kad ciklas baigiasi po 10 iteracijų. Tada iškviečiame funkciją „print()“, perduodame jai „ready“ įvesties teiginį ir naudojame parinktį „flush=True“.


Dabar galite matyti, kad kai vykdome kodą, ciklas priverčia funkciją paleisti „10“ kartų. Jis kartojamas 10 kartų, pradedant nuo nulio ir baigiant devyniais. Kiekviename pranešime yra užduoties numeris, kuris yra funkcijos numeris, kurį perduodame kaip „arg“ ir kūrimo numerį.


Ši nuosekli kilpa dabar transformuojama į kelių apdorojimo lygiagrečią for-ciklą. Naudojame tą patį kodą, bet ketiname naudoti keletą papildomų bibliotekų ir funkcijų, skirtų kelių apdorojimui. Todėl turime importuoti procesą iš kelių apdorojimo būdų, kaip paaiškinome anksčiau. Tada sukuriame funkciją pavadinimu „func“ ir perduodame raktinį žodį „arg“, prieš naudodami „val=random“, kad gautume atsitiktinį skaičių.

Tada, iškvietę „print()“ metodą, kad būtų parodytas pranešimas, ir suteikę parametrą „val“, kad atidėtų šiek tiek laiko, naudojame funkciją „if name= main“, kad apsaugotume įėjimo taškus. Tada sukuriame procesą ir iškviečiame funkciją procese naudodami „process“ ir perduodame „target=func“. Tada perduodame „func“, „arg“, perduodame reikšmę „m“ ir diapazoną „10“, o tai reiškia, kad ciklas baigia funkciją po „10“ iteracijų. Tada mes pradedame procesą naudodami „start()“ metodą su „procesas“. Tada iškviečiame „join()“ metodą, kad lauktume proceso vykdymo ir po to užbaigtume visą procesą.


Todėl, kai vykdome kodą, funkcijos iškviečia pagrindinį procesą ir pradeda jų vykdymą. Tačiau jie atliekami tol, kol bus įvykdytos visos užduotys. Tai matome, nes kiekviena užduotis atliekama vienu metu. Jis praneša savo pranešimą, kai tik jis bus baigtas. Tai reiškia, kad nors pranešimai yra netvarkingi, ciklas baigiasi po visų „10“ iteracijų.

Išvada

Šiame straipsnyje aptarėme „Python“ kelių apdorojimo for-ciklą. Taip pat pateikėme dvi iliustracijas. Pirmoje iliustracijoje parodyta, kaip „Python“ ciklo kelių apdorojimo bibliotekoje naudoti for-ciklą. O antroje iliustracijoje parodyta, kaip nuosekliąją for-ciklą pakeisti į lygiagrečią kelių apdorojimo ciklą. Prieš kurdami Python kelių apdorojimo scenarijų, turime importuoti kelių apdorojimo modulį.