Mjadala usio na msaada php. Kompyuta yenye nyuzi nyingi katika PHP: pthreads. Kuendesha nakala nyingi za hati - nakala moja kwa kila operesheni

Wakati mwingine inakuwa muhimu kufanya vitendo kadhaa wakati huo huo, kwa mfano, kuangalia mabadiliko katika meza moja ya database na kufanya marekebisho kwa mwingine. Zaidi ya hayo, ikiwa moja ya shughuli (kwa mfano, kuangalia mabadiliko) inachukua muda mwingi, ni dhahiri kwamba utekelezaji wa mfululizo hautahakikisha kusawazisha rasilimali.

Ili kutatua tatizo la aina hii, programu hutumia multithreading - kila operesheni huwekwa kwenye thread tofauti na kiasi kilichotengwa cha rasilimali na hufanya kazi ndani yake. Kwa njia hii, kazi zote zitakamilika tofauti na kwa kujitegemea.

Ingawa PHP haiungi mkono usomaji mwingi, kuna njia kadhaa za kuiga, ambazo zitajadiliwa hapa chini.

1. Kuendesha nakala kadhaa za hati - nakala moja kwa kila operesheni

//woman.php ikiwa (!isset($_GET["thread"])) (mfumo("wget ​​​​http://localhost/woman.php?thread=make_me_happy"); mfumo("wget ​​​​http: //localhost/ woman.php?thread=make_me_rich"); ) elseif ($_GET["thread"] == "make_me_happy") ( make_her_happy(); ) elseif ($_GET["thread"] == "make_me_rich" ) (tafuta_mwingine_moja();)

Tunapotekeleza hati hii bila vigezo, inaendesha nakala zake mbili kiotomatiki, ikiwa na vitambulisho vya utendakazi ("thread=make_me_happy" na "thread=make_me_rich"), ambayo huanzisha utendakazi wa utendakazi unaohitajika.

Kwa njia hii tunafikia matokeo yaliyohitajika - shughuli mbili zinafanywa wakati huo huo - lakini hii, bila shaka, sio multithreading, lakini tu crutch ya kufanya kazi wakati huo huo.

2. Njia ya Jedi - kwa kutumia ugani wa PCNTL

PCNTL ni kiendelezi kinachokuruhusu kufanya kazi kikamilifu na michakato. Mbali na usimamizi, inasaidia kutuma ujumbe, kuangalia hali na kuweka vipaumbele. Hivi ndivyo hati iliyotangulia kutumia PCNTL inavyoonekana:

$ pid = pcntl_fork(); ikiwa ($pid == 0) ( make_her_happy(); ) elseif ($pid > 0) ( $pid2 = pcntl_fork(); ikiwa ($pid2 == 0) ( find_another_one(); ) )

Inaonekana inachanganya sana, wacha tuipitie mstari kwa mstari.

Katika mstari wa kwanza, tuna "uma" mchakato wa sasa (uma ni kunakili mchakato wakati wa kuhifadhi maadili ya anuwai zote), tukigawanya katika michakato miwili (ya sasa na ya mtoto) inayoendesha sambamba.

Ili kuelewa ikiwa kwa sasa tuko katika mchakato wa mtoto au mama, kitendakazi cha pcntl_fork kinarudisha 0 kwa mtoto na kitambulisho cha mchakato kwa mama. Kwa hiyo, katika mstari wa pili, tunaangalia $pid, ikiwa ni sifuri, basi tuko katika mchakato wa mtoto - tunafanya kazi, vinginevyo, sisi ni mama (mstari wa 4), basi tunaunda mchakato mwingine na. vile vile kufanya kazi.

Mchakato wa utekelezaji wa hati:

Kwa hivyo, script huunda michakato 2 zaidi ya mtoto, ambayo ni nakala zake na ina vigezo sawa na maadili sawa. Na kwa kutumia kitambulisho kilichorejeshwa na kazi ya pcntl_fork, tunapata ni thread gani ambayo tuko ndani na kufanya vitendo muhimu.

Mama wa rafiki yangu mzuri alipoteza koti lake kwenye ndege kutoka St. -shati kutoka kwa mizigo yake ya mkono. Kwa ajili ya nyakati za zamani, nilimpa vidokezo kadhaa juu ya nini cha kufanya na wapi kukimbia, na leo niliamua kuandika kila kitu ninachojua juu ya mada fulani hapa.

Ili kueleza mahali nilipo smart sana, acha nikukumbushe kwamba wakati mmoja nilifanya kazi ya kushughulikia mashirika kadhaa ya ndege, ikiwa ni pamoja na kushughulikia masuala fulani yanayohusiana na utafutaji wa mizigo. Kweli, pamoja na uzoefu wangu wa kukimbia, bila shaka. Hata hivyo, kwa sababu Niliacha tasnia ya huduma ya anga miaka kadhaa iliyopita, labda nuances kadhaa zinaweza kuwa zimebadilika - ikiwa ni hivyo, nitakubali kwa shukrani maoni juu ya mada hiyo na kusahihisha habari kwenye chapisho.

Nitaanza na hii Unachohitaji kufanya ili kuzuia mzigo wako usipotee:
1. Vunja vitambulisho na vibandiko vyote vya safari za awali kutoka kwa koti lako, hata vidogo vilivyo na msimbo wa upau, ambavyo mara nyingi hubandikwa kando kwenye koti lenyewe - vinaweza kuchanganya mfumo wa kuchanganua mizigo kiotomatiki na kupanga.
2. Tundika lebo ya jina kwenye koti lako (begi, kisanduku, kifurushi - kwa ujumla, kila kitu unachoweka kama mzigo): unaweza kununua chaguo linaloweza kutumika tena mapema au kuchukua lebo ya karatasi kwenye kaunta ya kuingia - kwa kawaida yote. mashirika ya ndege zaidi au chini ya heshima huwapa bila vikwazo. Na Emirates, kwa mfano, kwa ujumla ina vitambulisho bora vya plastiki kwenye kamba ya kudumu ambayo inaweza kudumu kwa muda mrefu sana:

Wadanganyifu wa zamani wanaweza kufanya kama mimi: kila wakati huwa na lebo ya plastiki inayoweza kutumika tena kutoka kwa seti ya Samsonite inayoning'inia kwenye koti langu na anwani yangu ya kudumu ya nyumbani, nambari ya simu na barua pepe, na ninaporuka mahali fulani likizoni, kwa kuongeza mimi hutegemea karatasi ambayo mimi onyesha tarehe za kukaa kwangu katika sehemu mpya na anwani zote zinazowezekana (jina na anwani ya hoteli, nambari yake ya simu ya ndani, ikiwa inapatikana, na jina lako la kwanza na la mwisho, bila shaka).
3. Kwenye kaunta ya kuingia, hakikisha kwamba lebo ya mizigo iliyochapishwa na wakala wa kuingia imebandikwa kwenye mzigo wako - pamoja na msimbo wa jiji unalosafiria na nambari ya ndege.
4. Ikiwa una ndege kadhaa zinazounganisha, mwambie wakala wa kuingia kuhusu hili na ueleze ni kwa uhakika gani unataka kuangalia mizigo yako. Katika hali nyingine, mizigo italazimika kuchukuliwa kwenye uwanja wa ndege mmoja au mwingine kando ya njia, bila kujali hamu yako: hii inatumika, kwa mfano, kwa uhamishaji kati ya viwanja vya ndege (Orly na Charles de Gaulle huko Paris, Domodedovo - Sheremetyevo - "Vnukovo "huko Moscow), vituo tofauti (vituo 1 na 2 huko Frankfurt) au katika hatua ya kwanza ya kuwasili USA au Mexico - hii ni hitaji la forodha katika nchi hizi: tuseme unaruka Moscow-Washington-Phoenix, lebo ya mizigo. inatolewa kwa sehemu zote tatu hadi Phoenix, lakini huko Washington, mizigo itahitaji kuchukuliwa kimwili, kusafishwa kupitia forodha na kuangaliwa tena. Pia, ikiwa unaangalia kitembezi cha watoto ambacho uliruhusiwa kuchukua kabla ya kupanda. ndege, au mnyama, kuna uwezekano utahitaji kuichukua kwenye sehemu ya kupita. Kwa ujumla, katika kesi ya njia ngumu na uhamishaji, ni bora kufafanua maelezo ya usafirishaji wa mizigo mapema kwenye kituo cha simu cha ndege au, katika hali mbaya, wakati wa kuingia.
5. Fanya mizigo yako ionekane: ucheleweshaji wa mizigo sio kila wakati kosa la washughulikiaji wa mizigo au kushindwa katika mfumo wa kupanga. Wakati mwingine abiria mwingine asiye na nia, akiwa amechoka baada ya kukimbia kwa muda mrefu, atachukua kutoka kwenye jukwa la mizigo sawa na begi nyeusi ya Samsonite au nondescript kama yako. Kwa hivyo, weka alama kwenye mizigo yako: hutegemea rundo la ribbons mkali au toy ndogo laini kwenye kushughulikia, shika kibandiko kikubwa juu yake, au toa upendeleo kwa rangi isiyo ya kawaida wakati wa kuchagua koti.

Ni nini kisichopaswa kuchunguzwa kwenye mizigo?
Kumbuka, mashirika yote ya ndege na viwanja vya ndege hupoteza mizigo. Kwa kweli, takwimu ni tofauti kwa kila mtu, lakini hata mashirika ya ndege ya kuaminika zaidi yanaweza kupoteza au kuchelewesha mizigo, na hata kwenye uwanja wa ndege mdogo, ambapo mtunzi mmoja wa mizigo atasafirisha gari na koti moja kwa moja kutoka kwa kaunta ya kuingia hadi kwa ndege. Kwa hivyo, nakushauri kila wakati uchukue mizigo ya mkono wako:
- nyaraka muhimu, ikiwa ni pamoja na zile ambazo hazihitajiki wakati wa kukimbia (kwa mfano, katika safari yangu ya mwisho kwenda St. shule ya udereva)
- funguo (pamoja na lebo na anwani yako, hii inaweza kuwa hatari)
- pesa, vito vya mapambo (hakuna maoni)
- vifaa vya ghali tete
- dawa ambazo unachukua mara kwa mara, kwa kiasi kinachohitajika kwa kukimbia, na kwa hifadhi ndogo ikiwa unapaswa kutafuta analog katika nchi ya kigeni au jiji. Dawa za dawa ambazo haziwezi kununuliwa ikiwa mizigo yako imepotea, chukua na wewe kwa kiasi muhimu kwa safari nzima.
- kitu ambacho unaweza kuhitaji haraka unapowasili (kwa mfano, chaja ya simu
- kitu ambacho kina thamani ya hisia kwako kibinafsi: wakati mwingine mizigo hupotea milele, na ikiwa kupoteza diary yako ya kibinafsi kunavunja moyo wako, ni bora kuiacha nyumbani au kuichukua pamoja nawe kwenye ndege.

Hadithi ya kufundisha: wakati wa kazi yangu huko Lufthansa huko St. kesi ilikuwa siku iliyofuata. Bila shaka, shirika la ndege ni lawama kwa kupoteza mizigo, lakini ni nani anayefaidika na hili? Ili kuepuka hali hiyo, ilikuwa ya kutosha tu kuweka karatasi muhimu katika mizigo yako ya mkono.

Kwa hiyo, ulifika na haukupata mizigo yako kwenye ukanda wa mizigo. Nini cha kufanya?
1. Ikiwa umeangalia kwenye mizigo yako kitu kingine zaidi ya suti za kawaida: skis, cello, paneli ya ukubwa wa ukuta wa plasma, stroller ya mtoto, marumaru ya moja kwa moja ya Great Dane, angalia ikiwa kuna hatua tofauti ya kutoa kinachojulikana. mizigo ya kupita kiasi au mizigo yenye wingi - mizigo inayofanana na ile niliyoelezea hapo juu mara nyingi hupakiwa kwenye sehemu tofauti na kupakuliwa tofauti, kwa mikono. Ikiwa mizigo yako haipatikani huko pia
2. Nenda kwenye sehemu ya kufuatilia mizigo au kaunta ya Lost & Found. Huko utahitaji kujaza fomu maalum na maelezo ya kina kuhusu mizigo yako: njia, kuonekana, orodha fupi ya yaliyomo, mawasiliano yako mahali pa kudumu na kukaa kwa muda. Pia, katika huduma ya kufuatilia mizigo kuna uwezekano mkubwa wa kuona chati ya mizigo kama hii:

Ni kulingana na uainishaji huu kwamba mzigo wako uliokosekana utawekwa nambari na, kwa hivyo unaelewa, suti hizi mbili zitawekwa nambari sawa:

Kwa hivyo jisikie huru kuongeza maelezo ya ziada katika maelezo na usiruke kifungu cha maudhui. Kama sheria, unapojaza ripoti ya ucheleweshaji wa mizigo kwa mara ya kwanza, utaulizwa kuonyesha vitu kadhaa vya yaliyomo ambayo begi lako linaweza kutambuliwa ikiwa hakuna alama za kutambulisha nje na begi italazimika kufunguliwa (ikiwa mfuko umefunguliwa, utaweka taarifa kuhusu hili). Mfano mbaya: T-shati / kitabu / wipes mvua, mfano mzuri: bikini nyekundu nyekundu / katalogi ya uzazi wa Malevich / chuma cha kukunja. Baada ya kujaza ombi, mfanyakazi wa huduma ya kufuatilia mizigo atakupa nambari katika umbizo XXXYY11111, ambapo XXX ndio nambari ya uwanja wa ndege wa kuwasili, YY ndio nambari ya ndege ya kuwasili + tarakimu 5 za nambari ya serial ya maombi: kwa mfano, JFKLH12345, ikiwa ulisafiri kwa ndege na Lufthansa hadi Uwanja wa Ndege wa Kennedy huko New York. Kumbuka au uandike nambari hii - itakuwa njia rahisi zaidi ya kupata ombi lako katika programu zijazo.
Kwa kutumia nambari hiyo hiyo unaweza kuangalia hali ya utafutaji MWENYEWE (kwa sababu fulani kiungo kinatoweka: ikiwa hakifanyi kazi kwako, google World Tracer Online na kiunga cha pili - chenye kichwa cha Ufuatiliaji wa Mizigo kwenye tovuti worldtracer.aero - ndicho unachohitaji), kwa sababu kupata waliopotea&kupatikana. mara nyingi ni ngumu sana
3. Jaribu kuwasiliana na ofisi ya shirika lako la ndege kwenye uwanja wa ndege wa kuwasili: wakati mwingine (ninasisitiza - WAKATI fulani!) ikiwa haujasafiri nyumbani, lakini mahali pa kukaa kwa muda (likizo, safari ya biashara), shirika la ndege linaweza kutoa seti. ya vifaa vya kuogea (Lufthansa inayo). ni pamoja na T-shati kubwa, mswaki na kuweka, sega, vifurushi vidogo vya shampoo na gel ya kuoga, pakiti ya poda ya kuosha, n.k.) au kufanya malipo kidogo ya pesa kwa gharama ndogo. doa (malipo ya pesa taslimu).

Je, nini kitafuata?
Faili yako (inayoitwa AHL) itaenda kwenye mfumo wa utafutaji wa mizigo wa kati (World Tracer). Mizigo yote ambayo haijadaiwa huangukia katika mfumo ule ule wa utafutaji, haijalishi ikiwa ilipatikana bila lebo kwenye vijiti na sehemu za chini za uwanja wa mizigo au ilibaki kwenye mkanda wa mizigo; kwa kila moja ya bidhaa hizi, faili ya umbizo la XXXYY11111 ni. pia imeundwa, tu ya aina ndogo tofauti - kinachojulikana. ripoti ya mkono au OHD. Ikiwa data kutoka kwa faili za AHL na OHD zinalingana (jina la mwisho, maelezo ya koti, njia, n.k.), vituo vyote viwili (ambapo upotezaji wa mizigo uliripotiwa na ambapo mzigo ambao haujadaiwa ulipatikana) utapokea arifa, na kisha. ni suala la teknolojia: kuangalia upya na katika kesi ya kufanikiwa kusambaza mizigo kwa jiji linalohitajika. Bila shaka, pia kuna kazi nyingi za mikono zinazohusika - kubadilishana ujumbe, kukataa masanduku yanayofanana lakini si sawa, pamoja na kujibu simu nyingi - kwa ujumla, wafanyakazi wa huduma ya kufuatilia mizigo hawana kuchoka.
Takwimu za takriban: zaidi ya 90% ya mizigo iliyopotea hupatikana katika siku 3 za kwanza za utafutaji, 3% hupotea milele.
Unaweza kufanya nini?
1. Iwapo itabidi ununue chochote kinachohitajika haraka unapowasili (kutoka kwa mswaki hadi suti ya biashara), hakikisha kuwa umehifadhi stakabadhi zako kwa ajili ya fidia ya baadaye. Walakini, unapaswa kuepuka ununuzi wa gharama kubwa usiohitajika; nitaelezea kwa nini baadaye.
2. Kufuatia hatua mpya, tengeneza orodha ya kina zaidi ya yaliyomo, ikiwezekana kwa rangi, chapa na makadirio ya gharama ya kila bidhaa, haswa kwa Kiingereza (vinginevyo mfanyakazi wa shirika la ndege atalazimika kutafsiri orodha hii ili kuingia kwenye mfumo), wasiliana na shirika la ndege na kutuma Wanapokea orodha hii na itaongezwa kwenye programu ya utafutaji ya mizigo. Kwa siku 5 za kwanza, utaftaji wa mizigo unafanywa na uwanja wa ndege wa kuwasili, basi utaftaji unakuwa jukumu la shirika la ndege la ndege (shirika la ndege ambalo limeonyeshwa kwenye nambari ya maombi - kumbuka JFKLH12345?), na baada ya siku 21 anaweza kuomba fidia ya mwisho.
3. Ikiwa, baada ya siku 21 tangu tarehe ya kufungua taarifa kuhusu mizigo iliyopotea, haijapatikana, wasiliana na ndege ya carrier ili kudai fidia. Ikiwa sijakosea, amri ya mapungufu ni miaka 2, i.e. Unaweza kuomba fidia ndani ya miaka miwili kuanzia tarehe ya kuwasilisha dai la hasara.

Malipo ya fidia.
Ili kulipa fidia, utahitaji kuwasiliana na ofisi ya mwakilishi wa ndege yako na maombi ya malipo, nyaraka zinazothibitisha ndege na ukweli wa kupoteza mizigo (pasi za bweni, vitambulisho vya mizigo, nambari ya madai ya kupoteza mizigo, maelezo ya malipo). Ikiwa sijakosea, katika Shirikisho la Urusi uamuzi juu ya fidia lazima uzingatiwe kisheria ndani ya siku 30. Unaweza pia kuulizwa kukadiria gharama ya yaliyomo na, ikiwezekana, kutoa risiti za ununuzi wa koti na vitu vilivyomo (Ninaelewa kuwa hii sio kweli katika hali nyingi, lakini hii ni sehemu ya utaratibu).
Hapo awali, malipo yalifanywa kulingana na uzito wa mizigo iliyoangaliwa - karibu $ 20 kwa kilo. Baadaye, mfumo wa malipo ulibadilishwa na dhima ya mashirika ya ndege ilipunguzwa kwa vitengo 1,000 vya kawaida (gharama ya kitengo cha kawaida huhesabiwa ndani ya ndege), ambayo wakati wa kazi yangu ililingana na takriban euro 1,300. Wale. hata ukileta risiti ya ununuzi wa suti ya Louis Vuitton iliyotengenezwa kutoka kwa ngozi elfu moja ya gecko ya Bolivia na iliyojaa almasi, hautapata zaidi ya euro 1,300.

Inaonekana kwamba watengenezaji wa PHP mara chache hutumia concurrency. Sitazungumza juu ya unyenyekevu wa msimbo wa kusawazisha; programu iliyo na nyuzi moja, bila shaka, ni rahisi na wazi, lakini wakati mwingine matumizi kidogo ya usawa yanaweza kuleta ongezeko kubwa la utendaji.

Katika nakala hii, tutaangalia jinsi usomaji mwingi unaweza kupatikana katika PHP kwa kutumia kiendelezi cha pthreads. Hii itahitaji toleo la ZTS (Zend Thread Safety) la PHP 7.x kusakinishwa, pamoja na pthreads v3 kiendelezi kusakinishwa. (Wakati wa kuandika, katika PHP 7.1, watumiaji watahitaji kusakinisha kutoka kwa tawi kuu kwenye hazina ya pthreads - tazama kiendelezi cha mtu wa tatu.)

Ufafanuzi mdogo: pthreads v2 imekusudiwa kwa PHP 5.x na haitumiki tena, pthreads v3 ni ya PHP 7.x na inaendelezwa kikamilifu.

Baada ya mchepuko kama huu, tuelekee moja kwa moja kwenye uhakika!

Inachakata kazi za wakati mmoja

Wakati mwingine unataka kuchakata kazi za wakati mmoja kwa njia ya nyuzi nyingi (kwa mfano, kutekeleza kazi fulani ya I/O). Katika hali kama hizi, unaweza kutumia darasa la Thread kuunda nyuzi mpya na kuendesha usindikaji kwenye uzi tofauti.

Kwa mfano:

$task = darasa jipya linaongeza Thread ( private $response; public function run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $matches); $this->response = $matches; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) "Google"

Hapa njia ya kukimbia ni usindikaji wetu, ambao utatekelezwa ndani ya thread mpya. Wakati Thread ::start inaitwa, thread mpya inatolewa na njia ya kukimbia inaitwa. Kisha tunaunganisha uzi wa mtoto kurudi kwenye uzi mkuu kwa kupiga Thread::join , ambayo itazuia hadi uzi wa mtoto umalize kutekeleza. Hii inahakikisha kuwa kazi inakamilika kutekeleza kabla ya kujaribu kuchapisha matokeo (ambayo yanahifadhiwa katika jibu la $task->).

Huenda isipendeke kuchafua darasa na majukumu ya ziada yanayohusiana na mantiki ya mtiririko (pamoja na jukumu la kufafanua mbinu ya kukimbia). Tunaweza kutofautisha tabaka hizo kwa kuzirithi kutoka kwa tabaka la Threaded. Basi zinaweza kuendeshwa ndani ya uzi mwingine:

Kazi ya Hatari inapanua Mfululizo ( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->response = $matches; ) ) $task = Kazi mpya; $thread = new class($task) inapanua Thread ( private $task; public function __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork( );)); $thread->start() && $thread->jiunge(); var_dump($task->jibu);

Darasa lolote ambalo linahitaji kuendeshwa kwa uzi tofauti lazima kurithi kutoka kwa darasa la Threaded. Hii ni kwa sababu inatoa uwezo muhimu wa kufanya usindikaji kwenye nyuzi tofauti, pamoja na usalama kamili na violesura muhimu (kama vile ulandanishi wa rasilimali).

Wacha tuangalie safu ya darasa inayotolewa na upanuzi wa pthreads:

Threaded (hutekeleza Traversable, Collectable) Thread Worker Dimbwi Tete

Tayari tumeshughulikia na kujifunza misingi ya madarasa ya Thread na Threaded, sasa hebu tuangalie mengine matatu (Mfanyakazi, Tete, na Dimbwi).

Kutumia Nyuzi Tena

Kuanzisha uzi mpya kwa kila kazi inayohitaji kusawazishwa ni ghali sana. Hii ni kwa sababu usanifu wa kawaida-hakuna kitu lazima utekelezwe katika pthreads ili kufikia multithreading ndani ya PHP. Inayomaanisha kuwa muktadha wote wa utekelezaji wa mfano wa sasa wa mkalimani wa PHP (pamoja na kila darasa, kiolesura, sifa na kazi) lazima unakiliwa kwa kila uzi ulioundwa. Kwa sababu hii ina athari inayoonekana ya utendakazi, mtiririko unapaswa kutumiwa tena wakati wowote inapowezekana. Nyuzi zinaweza kutumika tena kwa njia mbili: kwa kutumia Wafanyakazi au kutumia Madimbwi.

Darasa la Mfanyakazi hutumiwa kufanya idadi ya kazi kwa usawa ndani ya uzi mwingine. Hii inafanywa kwa kuunda mfano mpya wa Mfanyakazi (ambao huunda uzi mpya), na kisha kusukuma kazi kwenye safu hiyo tofauti ya uzi (kwa kutumia Worker::stack).

Hapa kuna mfano mdogo:

Kazi ya Hatari inapanua Mizizi ( thamani ya $ ya kibinafsi; kazi ya umma __construct(int $i) ( $this->value = $i; ) kazi ya umma run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $worker = Mfanyakazi mpya(); $worker->anza(); kwa ($i = 0; $i stack(new Task($i)); ) huku ($worker->collect()); $worker->shutdown();

Katika mfano ulio hapo juu, kazi 15 za kitu kipya cha $worker husukumwa kwenye rafu kupitia Worker::stack mbinu, na kisha huchakatwa kwa mpangilio zilivyosukumwa. Njia ya Mfanyakazi::kukusanya, kama inavyoonyeshwa hapo juu, hutumika kusafisha kazi mara tu wanapomaliza kutekeleza. Pamoja nayo, ndani ya kitanzi cha muda, tunazuia thread kuu hadi kazi zote kwenye stack zimekamilika na kufutwa - kabla ya kupiga simu Worker::shutdown . Kukomesha mfanyikazi mapema (yaani, kukiwa bado na kazi zinazopaswa kukamilishwa) bado kutazuia uzi kuu hadi kazi zote zikamilishe utekelezaji wake, ili tu kwamba kazi hazitakusanywa takataka (ambazo zinajumuisha uvujaji wa kumbukumbu).

Darasa la Mfanyakazi hutoa mbinu zingine kadhaa zinazohusiana na mrundikano wake wa kazi, ikiwa ni pamoja na Worker::unstack kwa ajili ya kuondoa kazi iliyopangwa mwisho na Worker::getStacked kwa kupata idadi ya kazi katika safu ya utekelezaji. Rafu ya mfanyakazi ina majukumu ambayo yanahitaji kutekelezwa. Mara tu kazi kwenye stack imekamilika, huondolewa na kuwekwa kwenye safu tofauti (ya ndani) kwa ajili ya kukusanya takataka (kwa kutumia Worker::kukusanya njia).

Njia nyingine ya kutumia tena uzi kwenye kazi nyingi ni kutumia dimbwi la nyuzi (kupitia darasa la Dimbwi). Dimbwi la nyuzi hutumia kikundi cha Wafanyakazi kuwezesha kazi kutekelezwa kwa wakati mmoja, ambayo kipengele cha concurrency (idadi ya nyuzi za bwawa inafanya kazi nazo) huwekwa wakati bwawa linaundwa.

Wacha tubadilishe mfano hapo juu ili kutumia kundi la wafanyikazi:

Kazi ya Hatari inapanua Mizizi ( thamani ya $ ya kibinafsi; kazi ya umma __construct(int $i) ( $this->value = $i; ) kazi ya umma run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $pool = Dimbwi jipya(4); kwa ($i = 0; $i submit(new Task($i)); ) huku ($pool->collect()); $pool-> shutdown();

Kuna tofauti chache zinazojulikana wakati wa kutumia bwawa tofauti na mfanyakazi. Kwanza, bwawa la kuogelea halihitaji kuanzishwa kwa mikono; linaanza kutekeleza majukumu mara tu zinapopatikana. Pili, sisi tuma kazi kwa bwawa, si ziweke kwenye rundo. Kwa kuongeza, darasa la Dimbwi halirithi kutoka kwa Threaded na kwa hivyo haliwezi kupitishwa kwa nyuzi zingine (tofauti na Worker).

Ni utaratibu mzuri kwa wafanyakazi na mabwawa kusafisha kila mara kazi zao mara tu wanapomaliza, na kisha kuzisimamisha wenyewe. Nyuzi zilizoundwa kwa kutumia darasa la Thread lazima pia ziambatishwe kwenye uzi mzazi.

nyuzi na (im) kubadilika

Darasa la mwisho ambalo tutagusa ni Tete, nyongeza mpya kwa pthreads v3. Kutobadilika imekuwa dhana muhimu katika pthreads kwa sababu bila hiyo, utendaji unateseka sana. Kwa hivyo, kwa chaguo-msingi, sifa za madarasa ya Threaded ambazo wenyewe ni Vitu vya Threaded sasa hazibadiliki, na kwa hivyo haziwezi kuandikwa tena baada ya mgawo wao wa awali. Ubadilishaji dhahiri wa sifa kama hizi unapendelewa kwa sasa, na bado unaweza kupatikana kwa kutumia darasa jipya la Tete.

Wacha tuangalie mfano ambao utaonyesha vizuizi vipya vya kutoweza kubadilika:

Kazi ya Hatari inapanua Iliyowekwa Threaded // darasa lililo na Threaded ( kazi ya umma __construct() ( $this->data = new Threaded(); // $this->data haiwezi kuandikwa tena, kwani ni mali ya Threaded ya darasa la Threaded ) ) $task = new class(Task mpya()) inapanua Thread ( // a Threaded class, kwani Thread inapanua Threaded public function __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data); // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); // batili, kwa kuwa sifa hiyo ni mwanachama aliye na Threaded wa darasa la Threaded ) );

Sifa zilizo na nyuzi za madarasa Tete, kwa upande mwingine, zinaweza kubadilika:

Kazi ya Hatari inaenea Tete ( kazi ya umma __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // halali, kwa kuwa tuko katika darasa tete ) ) $task = mpya class(Task mpya()) huongeza Thread ( kazi ya umma __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // bado ni batili, kwa kuwa Tete inaenea kwa Threaded, kwa hivyo mali bado ni mwanachama aliye na Threaded wa darasa la Threaded $this->volatileMember = new StdClass(); ) );

Tunaweza kuona kuwa darasa la Tete linachukua nafasi ya kutoweza kubadilika iliyowekwa na mzazi wake darasa la Threaded ili kutoa uwezo wa kubadilisha mali ya Threaded (pamoja na unset() them).

Kuna mada nyingine ya majadiliano ya kufunika mada ya kubadilika na darasa Tete - safu. Katika pthreads, safu hutupwa kiotomatiki kwa vitu Tete zinapowekwa kwa mali ya darasa la Threaded. Hii ni kwa sababu sio salama kudhibiti safu ya muktadha nyingi za PHP.

Wacha tuangalie mfano tena ili kuelewa mambo kadhaa bora:

$safu =; $task = new class($array) inapanua Thread ( private $data; kazi ya umma __construct(array $array) ( $this->data = $array; ) kazi ya umma run() ( $this->data = 4; $ this->data = 5; print_r($this->data); ) ); $task->start() && $task->jiunge(); /* Pato: Kitu Tete ( => 1 => 2 => 3 => 4 => 5) */

Tunaona kuwa vitu Tete vinaweza kushughulikiwa kana kwamba ni safu kwa sababu vinaauni utendakazi wa safu kama vile (kama inavyoonyeshwa hapo juu) opereta ndogo()). Hata hivyo, madarasa Tete hayatumii kazi za msingi za safu kama vile array_pop na array_shift. Badala yake, darasa la Threaded hutupatia shughuli kama vile njia zilizojengwa.

Kama onyesho:

$data = darasa jipya linaenea Tete ( public $a = 1; public $b = 2; public $c = 3; ); var_dump(data ya $); var_dump($data->pop()); var_dump($data->shift()); var_dump(data ya $); /* Pato: kitu(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) kitu(darasa@bila kujulikana)#1 (1) ( ["b"]=> int(2) ) */

Shughuli zingine zinazotumika ni pamoja na Threaded::chunk na Threaded::merge .

Usawazishaji

Katika sehemu ya mwisho ya makala hii, tutaangalia maingiliano katika pthreads. Usawazishaji ni njia inayokuruhusu kudhibiti ufikiaji wa rasilimali zilizoshirikiwa.

Kwa mfano, hebu tutekeleze kihesabu rahisi:

$counter = darasa jipya linapanua Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) )); $counter->anza(); kwa ($i = 0; $i i; ) $counter->jiunge(); var_dump($counter->i); // itachapisha nambari kutoka 10 hadi 20

Bila matumizi ya ulandanishi, matokeo si ya kuamua. Mazungumzo mengi huandika kwa kibadilishaji sawa bila ufikiaji unaodhibitiwa, ambayo inamaanisha kuwa masasisho yatapotea.

Wacha turekebishe hii ili tupate matokeo sahihi ya 20 kwa kuongeza muda:

$counter = darasa jipya linapanua Thread ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; )); )); $counter->anza(); $counter->synchronized(function ($counter) ( kwa ($i = 0; $i i; ) ), $counter); $ counter-> join(); var_dump($counter->i); // int(20)

Vizuizi vya msimbo vilivyooanishwa vinaweza pia kuwasiliana kwa kutumia njia za Threaded:: wait and Threaded::notify (au Threaded::notifyAll).

Hapa kuna nyongeza mbadala katika mbili zilizosawazishwa wakati vitanzi:

$counter = darasa jipya linapanua Thread ( public $cond = 1; public function run() ( $this->synchronized(function () ( for ($i = 0; $i notify(); ikiwa ($this->cond === 1) ( $this->cond = 2; $this->subiri(); ) ) )); )); $counter->anza(); $counter->synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // subiri nyingine ianze kwanza ) kwa ($i = 10; $i notify(); ikiwa ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $ counter-> join(); /* Pato: int(0) int(10) int(1) int(11) int(2) int(12) int(3) int(13) int(4) int(14) int(5) int( 15) int(6) int(16) int(7) int(17) int(8) int(18) int(9) int(19) */

Unaweza kuona masharti ya ziada ambayo yamewekwa karibu na simu kwa Threaded::wait . Masharti haya ni muhimu kwa sababu yanaruhusu urejeshaji wa simu uliosawazishwa kuanza tena wakati imepokea arifa na hali iliyobainishwa ni kweli. Hii ni muhimu kwa sababu arifa zinaweza kutoka sehemu zingine isipokuwa wakati Threaded::notify inapoitwa. Kwa hivyo, ikiwa simu kwa Njia ya Threaded::ngoja haikufungwa katika hali, tutatekeleza simu za uongo za kuamka, ambayo itasababisha tabia ya nambari isiyotabirika.

Hitimisho

Tuliangalia madarasa matano ya kifurushi cha pthreads (Threaded, Thread, Worker, Volatile, and Pool) na jinsi kila darasa linatumika. Pia tuliangazia dhana mpya ya kutoweza kubadilika katika sehemu za nyuma na kutoa muhtasari mfupi wa uwezo wa ulandanishi unaotumika. Kwa misingi hii kuwekwa, sasa tunaweza kuanza kuangalia jinsi pthreads inaweza kutumika katika hali halisi ya ulimwengu! Hii itakuwa mada ya chapisho letu linalofuata.

Ikiwa una nia ya tafsiri ya chapisho linalofuata, nijulishe: maoni kwenye mitandao ya kijamii. mitandao, piga kura na ushiriki chapisho na wenzako na marafiki.

Majadiliano yenye nyuzi

A mjadala wa thread ni majadiliano ya kielektroniki (kama vile yale ya barua-pepe, orodha ya barua pepe, ubao wa matangazo, kikundi cha habari, au jukwaa la mtandao) ambamo programu humsaidia mtumiaji kwa kupanga ujumbe katika makundi. Ujumbe kwa kawaida hupangwa kwa kuonekana katika daraja kulingana na mada. Seti ya ujumbe uliowekwa kwa njia hii inaitwa a mada ya mada au tu "nyuzi". Jukwaa la majadiliano, mteja wa barua pepe au mteja wa habari inasemekana kuwa na "mada zilizounganishwa" ikiwa itaweka pamoja ujumbe kuhusu mada sawa ili usomaji rahisi kwa njia hii. Zaidi ya hayo, mijadala iliyounganishwa kwa kawaida huwaruhusu watumiaji kujibu uchapishaji fulani ndani ya mada. Kwa hivyo, kunaweza kuwa na safu ya majadiliano ndani ya mada ya mazungumzo. Aina mbalimbali za programu zinaweza kuruhusu uongozi huu kuonyeshwa katika kile inaitwa Njia ya Threaded. (Mbadala ni Njia ya Mstari, ambayo kwa kawaida huonyesha machapisho yote kwa mpangilio wa tarehe, bila kujali ni nani aliyemjibu nani haswa.)

Faida

Faida ya maoni yaliyounganishwa kwa mpangilio ni kwamba huruhusu msomaji kufahamu haraka muundo wa jumla wa mazungumzo: haswa ni nani anayejibu. Kwa hivyo ni muhimu sana katika hali ya mazungumzo marefu au mijadala, kama vile vikundi vya habari: kwa kweli, kwa mijadala tata sana, inakuwa vigumu kwa haraka kufuata hoja bila aina fulani ya mfumo wa upakuaji wa kidaraja.

Faida nyingine ni katika kuthamini kwa hila zaidi jumuiya katika mifumo iliyounganishwa kwa viwango. Kwa vile majibu yanapaswa kufanywa kwa machapisho maalum, pia yanatolewa kwa watu mahususi. Mazungumzo yenye nyuzi kwa hivyo huwa yanalenga mwandishi kwenye maoni na haiba mahususi ya mtu anayeitikiwa. Hii hutokea kidogo katika mkutano ambapo maoni ya hivi punde yameingizwa kwenye dimbwi la jumla.

Hasara

Ubaya wa uwekaji nyuzi za kihierarkia juu ya uzi wa gorofa ni kiwango cha kuongezeka cha shida, na mtazamo kama huo unahitaji kiwango cha juu cha faraja na ustaarabu kwa upande wa watumiaji wake. Kwa hivyo haishangazi kwamba uchukuaji wake umekuwa mzito zaidi katika baadhi ya jumuiya kongwe na/au za kisasa zaidi za mtandaoni, kama vile Usenet, CIX au Slashdot. Mifumo ya gumzo na maoni kwenye wavuti, kwa kulinganisha, ni changa na iko wazi kwa hadhira pana zaidi, na kwa hivyo uwekaji nyuzi wa tabaka umekuwa jambo la kawaida hivi majuzi katika nyanja kama hizo.

Kuweka daraja la mti pia kunaelekea kugawanya majadiliano ndani ya mada: haiwezekani tena kuchapisha ujumbe unaojibu au kufupisha machapisho kadhaa tofauti ya hapo awali. Badala yake, kila chapisho la awali lazima lijibiwe kibinafsi. Inaweza kubishaniwa kuwa hii inasababisha mtindo wa mijadala zaidi katika mabaraza ambayo hutumia utaftaji wa madaraja. Hata hivyo, ingawa hiyo inaweza kuwa kweli, ikiwa jibu lililounganishwa moja kwa moja haliwezekani tena kwa sababu ya wingi wa majibu kwa chapisho linalohitajika, watumiaji sasa mara nyingi wanatumia nukuu za mtu wanayemjibu ili kudumisha mazungumzo. vizuri Hili linapendekezwa na jumuia nyingi za bodi ya ujumbe katika tukio ambalo uchanganyaji umefikia kikomo chake cha kina.

Fungua uzi

Uzi ulio wazi hurejelea chapisho la blogu ambapo wasomaji wanaweza kutoa maoni na kujadili mada yoyote wanayochagua. Kawaida ni muhimu zaidi kwenye blogi maarufu zilizo na idadi kubwa ya trafiki; mara nyingi hutumika wakati mwandishi wa blogu hana mada ya kuchapisha au wakati kuna utulivu wa kuchapisha.

Nyuzi wazi pia hutumiwa kuvunja monotoni ya machapisho kwenye kurasa kuu za blogi. Maoni yanaweza kujengwa juu ya machapisho yanayolenga maudhui; kwa hivyo, waandishi hutumia nyuzi zilizo wazi ili nyakati za upakiaji wa ukurasa zisipunguzwe.

Mifano

*Yahoo! Vikundi[ http://groups.yahoo.com/], Vikundi vya MSN [ http://groups.msn.com/] na Slashdot [ http://www.slashdot.com/] zote hutoa mabaraza ya msingi ya wavuti ambayo yanaangazia mijadala yenye nyuzi.

Angalia pia

*Uandishi wa kisayansi wa anga
* Orodha ya masharti ya kublogi

Marejeleo

* Dartmouth. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Kuchukua majadiliano mtandaoni" ]
*Wolsey, T. DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Mjadala wa fasihi kwenye mtandao: Vijana wanaobalehe wanatumia vikundi vya majadiliano ya nyuzi kuzungumzia vitabu.] . "Kusoma Mtandaoni", 7(4), Januari/Februari 2004. Ilirejeshwa tarehe 30 Desemba 2007

Wikimedia Foundation. 2010.

  • Leon Powe
  • Barh Azoum

Angalia kamusi zingine:

    Jukwaa la mtandao- Kifurushi cha programu cha phpBB Internet Forum, mojawapo ya vifurushi maarufu vya jukwaa… Wikipedia

    Historia ya mazingira halisi ya kujifunza miaka ya 1990- Katika historia ya mazingira ya ujifunzaji mtandaoni, miaka ya 1990 ilikuwa wakati wa ukuaji, hasa kutokana na ujio wa kompyuta ya bei nafuu na ya mtandao.1990s1990* Formal Systems Inc. ya Princeton, NJ, Marekani inatanguliza Tathmini ya msingi ya DOS… … Wikipedia

    KAHAWA- Uso kwa Uso Uso kwa Uso wa Mazingira ya Kielimu Wasanidi Programu/Muungano wa LEAD Toleo thabiti 5.0 / Juni 2010 Mfumo wa Uendeshaji Jukwaa tofauti … Wikipedia

    Uingizaji wa mazungumzo- ni kipengele kinachotumiwa na wateja wengi wa barua pepe, ubao wa matangazo, vikundi vya habari, au mijadala ya Mtandao ambapo programu humsaidia mtumiaji kwa kupanga ujumbe katika makundi. Ujumbe kwa kawaida hupangwa kwa kuonekana katika daraja kulingana na mada. Seti ya jumbe zilizowekwa kwenye vikundi... ... Wikipedia

    Slashdot- Picha ya skrini ya URL ya ukurasa kuu wa Slashdot.org slashdot.org Slogan News kwa wajinga. Mambo muhimu...Wikipedia

    MediaWiki- nafasi ya majina inaelekezwa kwingine hapa. Kwa usaidizi kuhusu nafasi ya majina ya MediaWiki kwenye Wikipedia, angalia Help:MediaWiki namespace. Kwa maelezo ya jumla kuhusu nafasi za majina za Wikipedia, angalia Wikipedia:Nafasi ya majina. Ukurasa wa Majadiliano na ukurasa wa mazungumzo wa MediaWiki uelekeze kwingine hapa. Kwa... ... Wikipedia

    Mawasiliano ya kompyuta- Kwa matumizi mengine, angalia CMC (disambiguation). Mawasiliano ya upatanishi wa kompyuta (CMC) inafafanuliwa kama shughuli yoyote ya mawasiliano ambayo hutokea kwa kutumia kompyuta mbili au zaidi zilizo na mtandao. Ingawa neno hilo kijadi limerejelea wale… … Wikipedia

    Ulinganisho wa programu ya wiki- Majedwali yafuatayo yanalinganisha maelezo ya jumla na ya kiufundi kwa idadi ya vifurushi vya programu za wiki. Yaliyomo 1 Maelezo ya jumla 2 Hadhira inayolengwa 3 Sifa 1 4 Vipengele 2 … Wikipedia

    Uandishi wa anga wa kitaaluma- ni neno lililobuniwa na mwanasayansi tambuzi Stevan Harnad akielezea mseto wa barua pepe nyingi na kumbukumbu ya wavuti iliyounganishwa na mada kama vile kikundi cha habari, orodha ya barua pepe za kielektroniki, hypermail, mtandao wa habari au jukwaa la mtandao, lililounganishwa na kupangwa kwa tarehe,… … Wikipedia

    Programu shirikishi ya kufanya maamuzi- Programu ya kufanya maamuzi shirikishi (CDM) ni programu-tumizi au moduli inayoratibu kazi na vipengele vinavyohitajika ili kufikia maamuzi ya pamoja kwa wakati, na kuwawezesha washikadau wote husika kushiriki katika mchakato. ... ... Wikipedia

Hivi majuzi nilijaribu pthreads na nilishangaa - ni kiendelezi ambacho kinaongeza uwezo wa kufanya kazi na nyuzi nyingi za kweli katika PHP. Hakuna kuiga, hakuna uchawi, hakuna bandia - kila kitu ni kweli.



Ninazingatia kazi kama hiyo. Kuna dimbwi la kazi ambazo zinahitaji kukamilishwa haraka. PHP ina zana zingine za kusuluhisha shida hii, hazijatajwa hapa, kifungu ni kuhusu pthreads.



Threads ni nini

Ni hayo tu! Naam, karibu kila kitu. Kwa kweli, kuna jambo ambalo linaweza kumkasirisha msomaji mdadisi. Hakuna kati ya hii inayofanya kazi kwenye PHP ya kawaida iliyojumuishwa na chaguo-msingi. Ili kufurahia usomaji mwingi, lazima uwezeshe ZTS (Zend Thread Safety) katika PHP yako.

Mpangilio wa PHP

Ifuatayo, PHP na ZTS. Usijali tofauti kubwa katika muda wa utekelezaji ikilinganishwa na PHP bila ZTS (sekunde 37.65 vs 265.05), sikujaribu kujumuisha usanidi wa PHP. Katika kesi bila ZTS, nina XDebug kuwezeshwa kwa mfano.


Kama unavyoona, unapotumia nyuzi 2, kasi ya utekelezaji wa programu ni takriban mara 1.5 kuliko ilivyo kwa nambari ya mstari. Wakati wa kutumia nyuzi 4 - mara 3.


Unaweza kutambua kwamba ingawa processor ni 8-msingi, wakati wa utekelezaji wa programu ulibakia karibu bila kubadilika ikiwa nyuzi zaidi ya 4 zilitumika. Inaonekana kwamba hii ni kutokana na ukweli kwamba processor yangu ina cores kimwili 4. Kwa uwazi, nimeonyesha sahani kwa namna ya mchoro.


Muhtasari

Katika PHP, inawezekana kufanya kazi kwa umaridadi na usomaji mwingi kwa kutumia kiendelezi cha pthreads. Hii inatoa ongezeko kubwa la tija.

Lebo: Ongeza vitambulisho