Python Multiprocessing For-Loop

Python Multiprocessing For Loop



Monikäsittely on verrattavissa monisäikeiseen käsittelyyn. Se erottuu kuitenkin siinä, että voimme suorittaa vain yhden säikeen kerrallaan ketjutukseen käytetyn GIL:n vuoksi. Monikäsittely on prosessi, jossa toimintoja suoritetaan peräkkäin useiden prosessoriytimien kesken. Säikeitä ei voida käyttää rinnakkain. Moniprosessoinnin avulla voimme kuitenkin määrittää prosessit ja ajaa niitä samanaikaisesti useissa suoritinytimissä. Silmukka, kuten for-silmukka, on yksi yleisimmin käytetyistä komentosarjakielistä. Toista sama työ käyttämällä erilaisia ​​tietoja, kunnes saavutetaan jokin kriteeri, kuten ennalta määrätty iteraatioiden määrä. Silmukka suorittaa jokaisen iteraation yksitellen.

Esimerkki 1: For-silmukan käyttäminen Python Multiprocessing Module -moduulissa

Tässä esimerkissä käytämme for-silmukaa ja Python-monikäsittelymoduuliluokkaprosessia. Aloitamme hyvin suoraviivaisella esimerkillä, jotta ymmärrät nopeasti, kuinka Python-multiprocessing for-silmukka toimii. Moniprosessointi pakkaa prosessien luomisen käyttämällä liitäntää, joka on verrattavissa ketjutusmoduuliin.







Käyttämällä aliprosesseja säikeiden sijaan moniprosessointipaketti tarjoaa sekä paikallisen että etäisen samanaikaisuuden, jolloin vältetään Global Interpreter Lock. Käytä for-silmukkaa, joka voi olla merkkijonoobjekti tai monikko, iteroidaksesi jatkuvasti sekvenssiä. Tämä toimii vähemmän kuin avainsana, joka on nähty muissa ohjelmointikielissä, ja enemmän kuin iteraattorimenetelmä, joka löytyy muista ohjelmointikielistä. Aloittamalla uuden moniprosessoinnin voit ajaa for-silmukan, joka suorittaa proseduurin samanaikaisesti.



Aloitetaan toteuttamalla koodi koodin suorittamista varten käyttämällä 'spyder' -työkalua. Uskomme, että 'spyder' on myös paras Python-käyttöön. Tuomme moniprosessointimoduuliprosessin, jonka koodi on käynnissä. Python-konseptin moniprosessointi, jota kutsutaan 'prosessiluokiksi', luo uuden Python-prosessin, antaa sille menetelmän koodin suorittamiseen ja antaa pääsovellukselle tavan hallita suoritusta. Process-luokka sisältää start()- ja join()-proseduurit, jotka molemmat ovat tärkeitä.



Seuraavaksi määrittelemme käyttäjän määrittämän funktion nimeltä 'func'. Koska se on käyttäjän määrittämä funktio, annamme sille valitsemamme nimen. Tämän funktion rungossa välitämme 'subject'-muuttujan argumenttina ja 'matematiikan'-arvon. Seuraavaksi kutsumme 'print()'-funktiota välittäen lauseen 'Yleisen kohteen nimi on' sekä sen 'subject'-argumentin, joka sisältää arvon. Sitten seuraavassa vaiheessa käytämme 'if name== _main_', joka estää sinua suorittamasta koodia, kun tiedosto tuodaan moduulina, ja sallii sinun tehdä sen vain, kun sisältö suoritetaan komentosarjana.





Ehto-osio, jolla aloitat, voidaan useimmissa tapauksissa ajatella sijainnina, jossa tarjotaan sisältö, joka tulee suorittaa vain, kun tiedostosi suoritetaan komentosarjana. Sitten käytämme argumenttiaihetta ja tallennamme siihen arvoja, jotka ovat 'tiede', 'englanti' ja 'tietokone'. Prosessille annetaan sitten nimi 'prosessi1[]' seuraavassa vaiheessa. Sitten käytämme 'process(target=func)' kutsumaan funktiota prosessissa. Targetilla kutsutaan funktiota, ja tallennamme tämän prosessin muuttujaan 'P'.

Seuraavaksi käytämme 'prosessi1' kutsumaan 'append()'-funktiota, joka lisää kohteen luettelon loppuun, joka meillä on funktiossa 'func'. Koska prosessi on tallennettu 'P'-muuttujaan, välitämme 'P' tälle funktiolle sen argumenttina. Lopuksi käytämme 'start()'-funktiota 'P':n kanssa käynnistääksemme prosessin. Tämän jälkeen suoritamme menetelmän uudelleen samalla, kun annamme 'subject'-argumentin ja käytämme 'for' -kohdetta. Sitten käytämme 'prosessi1'- ja 'add()'-menetelmää vielä kerran, aloitamme prosessin. Prosessi suoritetaan sitten ja tulos palautetaan. Proseduuri käsketään sitten lopettamaan 'join()'-tekniikalla. Prosessit, jotka eivät kutsu 'join()'-menettelyä, eivät poistu. Yksi ratkaiseva seikka on, että 'args'-avainsanaparametria on käytettävä, jos haluat antaa argumentteja prosessin aikana.




Nyt voit nähdä lähdössä, että lauseke näytetään ensin välittämällä 'matematiikan' aiheen arvo, jonka siirrämme 'func'-funktioon, koska kutsumme sitä ensin 'prosessi'-funktiolla. Sitten käytämme 'append()' -komentoa saadaksemme arvot, jotka olivat jo luettelossa, joka lisätään loppuun. Sitten esiteltiin 'tiede', 'tietokone' ja 'englanti'. Mutta kuten näet, arvot eivät ole oikeassa järjestyksessä. Tämä johtuu siitä, että he tekevät niin nopeasti toimenpiteen päätyttyä ja raportoivat viestin.

Esimerkki 2: Jaksottaisen For-loopin muuntaminen moniprosessoivaksi rinnakkaissilmukaksi

Tässä esimerkissä moniprosessointisilmukkatehtävä suoritetaan peräkkäin ennen kuin se muunnetaan rinnakkaiseksi silmukan tehtäväksi. Voit selata sarjoja, kuten kokoelmaa tai merkkijonoa, niiden esiintymisjärjestyksessä käyttämällä for-silmukoita.

Aloitetaan nyt koodin käyttöönotto. Ensin tuomme 'uni' aikamoduulista. Käyttämällä aikamoduulin 'sleep()'-menettelyä voit keskeyttää kutsuvan säikeen suorittamisen niin kauan kuin haluat. Sitten käytämme satunnaista satunnaista moduulia, määritämme funktion nimellä 'func' ja välitämme avainsanan 'argu'. Sitten luomme satunnaisen arvon käyttämällä 'val' ja asetamme sen arvoon 'random'. Sitten estämme hetken käyttämällä 'sleep()'-menetelmää ja annamme 'val' parametriksi. Sitten viestin lähettämiseksi suoritamme 'print()'-menetelmän, jonka parametriksi välitetään sanat 'ready' ja avainsana 'arg' sekä 'created' ja välitetään arvo käyttämällä 'val'.

Lopuksi käytämme 'huuhtelua' ja asetamme sen arvoon 'True'. Käyttäjä voi päättää, puskuroiko tulos vai ei käyttämällä Pythonin tulostustoiminnon huuhteluvaihtoehtoa. Tämän parametrin oletusarvo False osoittaa, että lähtöä ei puskuroida. Tulos näytetään toisiaan seuraavien rivien sarjana, jos asetat sen arvoon tosi. Sitten käytämme 'if name== main' suojataksemme sisääntulokohdat. Seuraavaksi suoritamme työn peräkkäin. Tässä asetimme alueen arvoon '10', mikä tarkoittaa, että silmukka päättyy 10 iteroinnin jälkeen. Seuraavaksi kutsumme 'print()'-funktiota, välitämme sille 'ready'-syöttölausekkeen ja käytämme vaihtoehtoa 'flush=True'.


Voit nyt nähdä, että kun suoritamme koodin, silmukka saa funktion suorittamaan '10' kertaa. Se iteroidaan 10 kertaa alkaen indeksistä nolla ja päättyen indeksiin yhdeksän. Jokainen viesti sisältää tehtävänumeron, joka on funktionumero, jonka välitämme 'arg'- ja luontinumerona.


Tämä peräkkäinen silmukka muunnetaan nyt moniprosessoitavaksi rinnakkaiseksi for-silmukaksi. Käytämme samaa koodia, mutta aiomme käyttää joitain ylimääräisiä kirjastoja ja toimintoja monikäsittelyä varten. Siksi meidän on tuotava prosessi moniprosessoinnista, aivan kuten selitimme aiemmin. Seuraavaksi luomme funktion nimeltä 'func' ja välitämme avainsanan 'arg' ennen kuin käytämme 'val=random' saadaksemme satunnaisluvun.

Sitten, kun olemme käynnistäneet 'print()'-menetelmän viestien näyttämiseksi ja antaneet 'val'-parametrin viivästyttääkseen hetken, käytämme 'if name = main' -toimintoa suojataksemme sisääntulokohdat. Tämän jälkeen luomme prosessin ja kutsumme prosessin funktiota käyttämällä 'prosessia' ja välitämme 'target=func'. Sitten välitetään 'func', 'arg', välitetään arvo 'm' ja väli '10', mikä tarkoittaa, että silmukka päättää funktion '10' iteroinnin jälkeen. Sitten aloitamme prosessin käyttämällä 'start()'-menetelmää 'prosessilla'. Sitten kutsumme 'join()' -menetelmää odottamaan prosessin suorittamista ja suorittamaan koko prosessin sen jälkeen.


Siksi, kun suoritamme koodin, funktiot kutsuvat pääprosessin ja aloittavat suorituksensa. Niitä kuitenkin tehdään, kunnes kaikki tehtävät on suoritettu. Näemme sen, koska jokainen tehtävä suoritetaan samanaikaisesti. Se raportoi viestinsä heti, kun se on valmis. Tämä tarkoittaa, että vaikka viestit ovat epäkunnossa, silmukka päättyy, kun kaikki '10' iteraatiota on suoritettu.

Johtopäätös

Käsittelimme Python-multiprocessing for-silmukan tässä artikkelissa. Esitimme myös kaksi kuvaa. Ensimmäinen kuva näyttää, kuinka for-silmukkaa käytetään Pythonin silmukan monikäsittelykirjastossa. Ja toinen kuva näyttää, kuinka peräkkäinen for-silmukka muutetaan rinnakkaiseksi moniprosessoitavaksi for-silmukaksi. Ennen kuin rakennamme Python-monikäsittelyn komentosarjan, meidän on tuotava moniprosessointimoduuli.