Sākums / Internets / Anēmisks diskusiju pavediens php. Daudzpavedienu skaitļošana PHP: pthreads. Kas ir pthreads

Anēmisks diskusiju pavediens php. Daudzpavedienu skaitļošana PHP: pthreads. Kas ir pthreads

Šķiet, ka PHP izstrādātāji reti izmanto vienlaicīgumu. Es nerunāšu par sinhronā koda vienkāršību, protams, vienkāršāka un skaidrāka, bet dažreiz mazs lietojums paralēlisms var nodrošināt ievērojamus veiktspējas uzlabojumus.

Šajā rakstā mēs apskatīsim, kā PHP var sasniegt daudzpavedienu, izmantojot paplašinājumu pthreads. Lai to izdarītu, jums būs jāinstalē PHP 7.x ZTS (Zend Thread Safety) versija, kā arī instalēts paplašinājums pthreads v3. (Šī raksta tapšanas laikā PHP 7.1 versijā lietotājiem būs jāinstalē no galvenās filiāles pthreads repozitorijā — skatiet trešās puses paplašinājumu.)

Neliels precizējums: pthreads v2 ir paredzēts PHP 5.x un vairs netiek atbalstīts, pthreads v3 ir paredzēts PHP 7.x un tiek aktīvi izstrādāts.

Pēc šādas atkāpes ķersimies pie lietas!

Vienreizēju uzdevumu apstrāde

Dažreiz vēlaties apstrādāt vienreizējus uzdevumus vairāku pavedienu veidā (piemēram, izpildot kādu I/O saistītu uzdevumu). Šādos gadījumos varat izmantot klasi Thread, lai izveidotu jaunu pavedienu un veiktu apstrādi atsevišķā pavedienā.

Piemēram:

$task = new class paplašina pavedienu ( privāta $response; publiska funkcija palaist() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $saturs, $atbilst); $this->response = $atbilst; ) ); $uzdevums->start() && $task->join(); var_dump($task->response); // virkne (6) "Google"

Šeit izpildes metode ir mūsu apstrāde, kas tiks izpildīta jaunā pavedienā. Kad tiek izsaukts Thread::start, tiek izveidots jauns pavediens un tiek izsaukta palaišanas metode. Pēc tam mēs pievienojam pakārtoto pavedienu atpakaļ galvenajam pavedienam, izsaucot Thread::join , kas tiks bloķēta, līdz pakārtotā pavediena izpilde būs pabeigta. Tas nodrošina, ka uzdevums tiek pabeigts, pirms mēs mēģinām izdrukāt rezultātu (kas tiek saglabāts mapē $task->response).

Var nebūt vēlams piesārņot klasi ar papildu pienākumiem, kas saistīti ar plūsmas loģiku (tostarp atbildību par izpildes metodes definēšanu). Mēs varam atšķirt šādas klases, mantojot tās no Threaded klases. Pēc tam tos var palaist citā pavedienā:

Klases uzdevums paplašina pavedienu (publisks $atbilde; publiska funkcija someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->response = $matches ) ) $task = new Task; $thread = new class($task) paplašina Thread ( privāts $task; publiska funkcija __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork( ) ) ); $pavediens->sākt() && $pavediens->pievienoties(); var_dump($uzdevums->atbilde);

Jebkura klase, kas jāpalaiž atsevišķā pavedienā obligāti mantot no klases Threaded. Tas ir tāpēc, ka tas nodrošina vajadzīgās iespējas, lai veiktu apstrādi dažādos pavedienos, kā arī netieša drošība un noderīgas saskarnes (piemēram, resursu sinhronizācija).

Apskatīsim klases hierarhiju, ko piedāvā pthreads paplašinājums:

Vītņots (īsteno Traversable, Collectable) Thread Worker Volatile Pool

Mēs jau esam iekļāvuši un apguvuši nodarbību Thread un Threaded pamatus, tagad apskatīsim pārējās trīs (Darbnieks, Volatile un Pool).

Pavedienu atkārtota izmantošana

Jauna pavediena sākšana katram uzdevumam, kas ir jāparalēlizē, ir diezgan dārga. Tas ir tāpēc, ka pthreados ir jāīsteno vispārpieņemta nekāda arhitektūra, lai panāktu daudzpavedienu izmantošanu PHP. Tas nozīmē, ka viss PHP tulka pašreizējās instances izpildes konteksts (ieskaitot katru klasi, saskarni, iezīmi un funkciju) ir jākopē katram izveidotajam pavedienam. Tā kā tam ir ievērojama ietekme uz veiktspēju, straume vienmēr ir jāizmanto atkārtoti, kad vien iespējams. Pavedienus var atkārtoti izmantot divos veidos: izmantojot Workers vai pūliņus.

Darbinieku klase tiek izmantota, lai sinhroni veiktu vairākus uzdevumus citā pavedienā. Tas tiek darīts, izveidojot jaunu Worker instanci (kas izveido jaunu pavedienu) un pēc tam ievietojot uzdevumus šī atsevišķā pavediena kaudzē (izmantojot Worker::steck).

Šeit ir neliels piemērs:

Klases uzdevums paplašina Threaded ( privātā $vērtība; publiskā funkcija __construct(int $i) ( $this->value = $i; ) publiskā funkcija run() ( usleep(250000); echo "Uzdevums: ($this->value) \n"; ) ) $darbinieks = new Worker(); $darbinieks->sākt(); for ($i = 0; $i steck(new Task($i)); ) while ($worker->collect()); $darbinieks->shutdown();

Iepriekš minētajā piemērā 15 uzdevumi jaunam $worker objektam tiek ievietoti kaudzē, izmantojot metodi Worker::steck, un pēc tam tie tiek apstrādāti secībā, kādā tie tika nosūtīti. Metode Worker::collect, kā parādīts iepriekš, tiek izmantota, lai notīrītu uzdevumus, kad tie ir pabeigti. Ar to, kamēr cilpas ietvaros, mēs bloķējam galveno pavedienu, līdz visi steka uzdevumi ir pabeigti un notīrīti - pirms mēs izsaucam Worker::shutdown . Priekšlaicīga darbinieka pārtraukšana (t.i., kamēr vēl ir jāpabeidz uzdevumi) joprojām bloķēs galveno pavedienu, līdz visi uzdevumi būs pabeiguši to izpildi, tikai tāpēc, ka uzdevumi netiks savākti (kas nozīmē atmiņas noplūdes).

Darbinieku klase nodrošina vairākas citas metodes, kas saistītas ar tās uzdevumu steku, tostarp Worker::unstack, lai noņemtu pēdējo steka uzdevumu, un Worker::getStacked, lai iegūtu uzdevumu skaitu izpildes stekā. Darbinieka kaudze satur tikai tos uzdevumus, kas jāizpilda. Kad uzdevums uz kaudzes ir izpildīts, tas tiek noņemts un novietots uz atsevišķas (iekšējas) kaudzes atkritumu savākšanai (izmantojot metodi Worker::collect).

Vēl viens veids, kā atkārtoti izmantot pavedienu vairākos uzdevumos, ir izmantot pavedienu kopu (izmantojot Pool klasi). Pavedienu pūls izmanto darbinieku grupu, lai iespējotu uzdevumu izpildi vienlaikus, kurā, izveidojot pūlu, tiek iestatīts vienlaicības faktors (pūla pavedienu skaits, ar kuriem tas darbojas).

Pielāgosim iepriekš minēto piemēru, lai izmantotu darbinieku kopu:

Klases uzdevums paplašina Threaded ( privātā $vērtība; publiskā funkcija __construct(int $i) ( $this->value = $i; ) publiskā funkcija run() ( usleep(250000); echo "Uzdevums: ($this->value) \n"; ) ) $pool = new Pool(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $pool->shutdown();

Izmantojot baseinu, nevis strādnieku, pastāv dažas ievērojamas atšķirības. Pirmkārt, pūls nav jāsāk manuāli, tas sāk izpildīt uzdevumus, tiklīdz tie kļūst pieejami. Otrkārt, mēs nosūtīt uzdevumus uz baseinu, nevis salieciet tos uz kaudzes. Turklāt Pool klase netiek mantota no Threaded, un tāpēc to nevar nodot citiem pavedieniem (atšķirībā no Worker).

Tā ir laba prakse, kad darbinieki un pūli vienmēr veic savus uzdevumus, tiklīdz tie ir pabeiguši, un pēc tam paši tos manuāli pārtrauc. Pavedieni, kas izveidoti, izmantojot Thread klasi, ir jāpievieno arī vecākajam pavedienam.

ppavedieni un (ne)mainība

Pēdējā klase, kurai mēs pieskarsimies, ir Volatile, jauns pthreads v3 papildinājums. Nemainība ir kļuvusi par svarīgu jēdzienu pthreads, jo bez tā veiktspēja ievērojami cieš. Tāpēc pēc noklusējuma Threaded klašu rekvizīti, kas pašas ir Threaded objekti, tagad ir nemainīgi, un tāpēc tos nevar pārrakstīt pēc sākotnējās piešķiršanas. Pašlaik priekšroka tiek dota šādu īpašību nepārprotamai mainīgumam, un to joprojām var panākt, izmantojot jauno Volatile klasi.

Apskatīsim piemēru, kas demonstrēs jaunos nemainīguma ierobežojumus:

Klases uzdevums paplašina Threaded // Threaded klasi (publiskā funkcija __construct() ( $this->data = new Threaded(); // $this->data nav pārrakstāma, jo tas ir Threaded klases īpašums Threaded) ) $task = new class(new Task()) paplašina pavedienu ( // Threaded klase, jo Thread paplašina Threaded publisko funkciju __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data);

No otras puses, gaistošo klašu vītņotās īpašības ir mainīgas:

Klases uzdevums paplašina nepastāvīgu (publiskā funkcija __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // derīgs, jo mēs atrodamies nepastāvīgā klasē ) ) $task = new class(new Task()) paplašina pavedienu (publiskā funkcija __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // objekts(stdClass)#4 (0) () // joprojām nav derīgs, jo Volatile paplašina Threaded, tāpēc īpašums joprojām ir Threaded klases Threaded dalībnieks $this->volatileMember = new StdClass() );

Mēs redzam, ka nepastāvīgā klase ignorē nemainīgumu, ko uzliek tās vecākklase Threaded, lai nodrošinātu iespēju mainīt vītņu īpašības (kā arī atiestatīt () tos).

Ir vēl viens diskusiju priekšmets, lai aptvertu mainīguma un nepastāvīgās klases tēmu - masīvi. Pthreados masīvi tiek automātiski nodoti nepastāvīgajiem objektiem, ja tie tiek piešķirti Threaded klases rekvizītam. Tas ir tāpēc, ka vienkārši nav droši manipulēt ar vairāku PHP kontekstu masīvu.

Vēlreiz apskatīsim piemēru, lai labāk izprastu dažas lietas:

$masīvs = ; $task = new class($masīvs) paplašina Thread ( privātie $dati; publiskā funkcija __construct(masīvs $masīvs) ( $this->data = $masīvs; ) publiskā funkcija run() ( $this->data = 4; $ šis->dati = 5; print_r($this->data) ); $uzdevums->sākt() && $uzdevums->pievienoties(); /* Izvade: gaistošs objekts ( => 1 => 2 => 3 => 4 => 5) */

Mēs redzam, ka nepastāvīgus objektus var uzskatīt par masīviem, jo ​​tie atbalsta masīva darbības, piemēram, (kā parādīts iepriekš) operatoru subset (). Tomēr nepastāvīgās klases neatbalsta pamata masīva funkcijas, piemēram, array_pop un array_shift. Tā vietā Threaded klase nodrošina mums tādas darbības kā iebūvētas metodes.

Kā demonstrācija:

$dati = jauna klase paplašinās Nepastāvīgs (publisks $a = 1; publiskais $b = 2; publiskais $c = 3; ); var_dump($dati); var_dump($dati->pop()); var_dump($dati->shift()); var_dump($dati); /* Izvade: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) objekts(klase@anonīms)#1 (1) ( ["b"]=> int(2) ) */

Citas atbalstītās darbības ietver Threaded::chunk un Threaded::merge .

Sinhronizācija

Šī raksta pēdējā sadaļā mēs apskatīsim sinhronizāciju pthreados. Sinhronizācija ir metode, kas ļauj kontrolēt piekļuvi koplietotajiem resursiem.

Piemēram, ieviesīsim vienkāršu skaitītāju:

$skaitītājs = new class extens Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $skaitītājs->sākt(); for ($i = 0; $i i; ) $counter->join(); var_dump($skaitītājs->i); // izdrukās skaitli no 10 līdz 20

Neizmantojot sinhronizāciju, izvade nav determinēta. Vairāki pavedieni raksta uz vienu un to pašu mainīgo bez kontrolētas piekļuves, kas nozīmē, ka atjauninājumi tiks zaudēti.

Izlabosim to, lai iegūtu pareizo izvadi — 20, pievienojot laiku:

$skaitītājs = new class paplašina Thread ( public $i = 0; public function run() ( $this-> synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $skaitītājs->sākt(); $skaitītājs->sinhronizēts(funkcija ($skaitītājs) ( for ($i = 0; $i i; ) ), $skaitītājs); $counter->join(); var_dump($skaitītājs->i); // int(20)

Sinhronizēto kodu bloki var arī sazināties savā starpā, izmantojot Threaded::wait un Threaded::notify (vai Threaded::notifyAll) metodes.

Šeit ir alternatīvs pieaugums divās sinhronizētās kamēr cilpās:

$skaitītājs = new class paplašina Thread ( public $cond = 1; public function run() ( $this-> synchronized(function ()) ( for ($i = 0; $i notify();); if ($this->cond === 1) ( $this->cond = 2; $this->wait(); ) ) )); $skaitītājs->sākt(); $counter-> synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // gaidīt, kamēr otrs sāks pirmais ) for ($i = 10; $i paziņot(); ja ($skaitītājs->kond. === 2) ( $skaitītājs->kond. = 1; $skaitītājs->gaida(); ) ) ), $skaitītājs); $counter->join(); /* Izvade: 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) */

Jūs varat pamanīt papildu nosacījumus, kas ir noteikti ap izsaukumu Threaded::wait . Šie nosacījumi ir kritiski, jo tie ļauj atsākt sinhronizēto atzvanīšanu, kad tas ir saņēmis paziņojumu un norādītais nosacījums ir patiess. Tas ir svarīgi, jo paziņojumi var nākt no citām vietām, nevis tad, kad tiek izsaukts Threaded::notify. Tādējādi, ja izsaukumi uz Threaded::wait metodi nebija ietverti nosacījumos, mēs izpildīsim viltus modināšanas zvani, kas novedīs pie neparedzamas koda darbības.

Secinājums

Mēs apskatījām piecas pthreads pakotnes klases (Threaded, Thread, Worker, Volatile un Pool) un to, kā tiek izmantota katra klase. Mēs arī apskatījām jauno pthreadu nemainīguma koncepciju, kas tika izveidota īss pārskats atbalstītās sinhronizācijas iespējas. Kad šie pamati ir ieviesti, mēs tagad varam sākt meklēt, kā pthreads var izmantot reālās pasaules gadījumos! Tā būs mūsu nākamā ieraksta tēma.

Ja jūs interesē nākamā ieraksta tulkojums, dodiet ziņu: komentējiet sociālajos tīklos. tīklos, novērtējiet un kopīgojiet ziņu ar kolēģiem un draugiem.

Pavedienu diskusija

A vītņota diskusija ir elektroniska diskusija (piemēram, pa e-pastu, e-pasta saraksts, ziņojumu dēlis , intereškopas vai interneta forums), kurā programmatūra palīdz lietotājam, vizuāli grupējot ziņojumus. Ziņojumi parasti tiek vizuāli grupēti hierarhijā pēc tēmas. Šādā veidā sagrupētu ziņojumu kopu sauc par a tēmas pavediens vai vienkārši "pavediens". Tiek uzskatīts, ka diskusiju forumam, e-pasta klientam vai ziņu klientam ir "pavedienu tēmas", ja tajā ir apkopoti ziņojumi par vienu un to pašu tēmu, lai šādā veidā būtu ērti lasīt. Turklāt pavedienu diskusijas parasti ļauj lietotājiem atbildēt uz konkrētu ziņu tēmas pavedienā. Līdz ar to pavediena tēmā var būt diskusiju hierarhija. Dažāda veida programmatūra var ļaut šo hierarhiju parādīt sadaļās. sauc par vītņu režīmu. (Alternatīva ir lineārais režīms, kas parasti parāda visas ziņas datuma secībā neatkarīgi no tā, kurš, iespējams, kam ir īpaši atbildējis.)

Priekšrocības

Hierarhiski vītņu skatījumu priekšrocība ir tā, ka tie ļauj lasītājam ātri novērtēt sarunas kopējo struktūru: konkrēti, kurš kuram atbild. Kā tāds tas ir visnoderīgākais situācijās ar paplašinātām sarunām vai debatēm, piemēram, intereškopas: patiešām sarežģītām debatēm ātri kļūst neiespējami sekot argumentam, ja nav izveidota hierarhiska pavedienu sistēma.

Vēl viens ieguvums ir kopienas smalkāka novērtēšana hierarhiski vītņotās sistēmās. Tā kā atbildes ir jāsniedz uz konkrētiem amatiem, tās tiek sniegtas arī konkrētām personām. Tāpēc vītņotajās sarunās rakstnieks tiek koncentrēts uz tā indivīda īpašajiem uzskatiem un personību, uz kuru tiek atbildēts. Tas notiek retāk forumos, kur jaunākais komentārs tiek vienkārši ievietots vispārējā pūlā.

Trūkumi

Hierarhiskās vītnes trūkums salīdzinājumā ar plakano vītni ir paaugstināts sarežģītības līmenis, un tāpēc šāds skats no tā lietotājiem prasa paaugstinātu komforta un izsmalcinātības līmeni. Tāpēc nav pārsteidzoši, ka tā ir bijusi vissmagākā dažās no vecākajām un/vai vismodernākajām tiešsaistes kopienām, piemēram, Usenet, CIX vai Slashdot. Salīdzinājumam, tīmekļa tērzēšanas un komentāru sistēmas ir jaunākas un atvērtas plašākai auditorijai, un tāpēc hierarhiska pavedienu veidošana šādās jomās ir kļuvusi par ikdienu.

Koka hierarhijas uzspiešana mēdz arī sadrumstalot diskusiju tēmas ietvaros: vairs nav iespējams ievietot ziņojumu, atbildot uz vairākiem dažādiem iepriekšējiem ierakstiem vai apkopojot tos. Tā vietā uz katru iepriekšējo ziņu ir jāatbild atsevišķi. Var strīdēties, ka tas izraisa konfrontējošāku debašu stilu forumos, kuros izmanto hierarhisku pavedienu. Tomēr, lai arī tā varētu būt, ja tieša pavediena atbilde vairs nav iespējama, jo uz vēlamo ziņu ir daudz atbilžu, lietotāji tagad bieži izmanto tās personas citātus, uz kurām viņi atbild, lai saruna būtu pareiza un plūstoša. gludi To iesaka lielākā daļa ziņojumu dēļu kopienu gadījumā, ja pavedienu izveide ir sasniegusi savu citādi visaptverošo ierobežojumu.

Atvērt pavedienu

Atvērts pavediens attiecas uz emuāra ziņu, kurā lasītāji var komentēt un apspriest jebkuru tēmu, kuru viņi izvēlas. Tie parasti ir noderīgāki populāros emuāros ar lielu daudzumu satiksme; tos bieži izmanto, ja emuāra autoram nav tēmas, par kurām publicēt vai publicēšana ir apstājusies.

Atvērtie pavedieni tiek izmantoti arī, lai izjauktu ziņu monotoniju emuāru galvenajās lapās. Uz saturu orientētām ziņām var veidoties komentāri; tādēļ autori izmanto atvērtos pavedienus, lai lapas ielādes laiks netiktu palēnināts.

Piemēri

* Yahoo! Grupas [ http://groups.yahoo.com/], MSN grupas [ http://groups.msn.com/] un Slashdot [ http://www.slashdot.com/] visi piedāvā tīmekļa forumus, kuros ir vītņotas diskusijas.

Skatīt arī

* Zinātniskā Skywriting
* Emuāru veidošanas terminu saraksts

Atsauces

*Dārtmuta. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Diskusijas uzņemšana tiešsaistē" ]
*Wolsey, T. DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Diskusija par literatūru kibertelpā: jauni pusaudži izmanto vītņu diskusiju grupas, lai runātu par grāmatām] . "Reading Online", 7(4), 2004. gada janvāris/februāris. Iegūts 2007. gada 30. decembrī

Wikimedia fonds.

  • 2010. gads.
  • Leons Pū

Barh Azoum

    Apskatiet citas vārdnīcas: Interneta forums

    - phpBB Internet Forum programmatūras pakotne, viena no populārākajām forumu pakotnēm… Wikipedia Virtuālo mācību vidi vēsture 1990. gadi

    - Virtuālo mācību vidi vēsturē 90. gadi bija izaugsmes laiks, galvenokārt tāpēc, ka parādījās dators par pieņemamu cenu un internets. 1990. gadi, 1990. gads* Formal Systems Inc. Prinstonā, Ņūdžersijā, ASV ievieš uz DOS balstītu novērtējumu… … Wikipedia- Sadarbības aci pret aci izglītības vides izstrādātājs(-i) LEAD konsorcijs Stabils laidiens 5.0 / 2010. gada jūnijs Operētājsistēma Vairāku platformu… Wikipedia

    Sarunu vītņošana- ir līdzeklis, ko izmanto daudzi e-pasta klienti, ziņojumu dēļi, intereškopas vai interneta forumi, kuros programmatūra palīdz lietotājam, vizuāli grupējot ziņojumus. Ziņojumi parasti tiek vizuāli grupēti hierarhijā pēc tēmas. Ziņojumu kopa, kas sagrupēta... ... Wikipedia

    Slashdot- Ekrānuzņēmums no Slashdot.org galvenās lapas URL slashdot.org sauklis Ziņas nerdiem. Lietas, kurām ir nozīme...Wikipedia

    MediaWiki- nosaukumvieta novirza šeit. Palīdzību par MediaWiki nosaukumvietu Vikipēdijā skatiet sadaļā Palīdzība:MediaWiki nosaukumvieta. Vispārīgu informāciju par Wikipedia nosaukumvietām skatiet sadaļā Wikipedia: Namespace. Sarunu lapas un MediaWiki sarunu lapas novirzīšana šeit. Par... ... Wikipedia

    Saziņa ar datoru starpniecību- Par citiem lietojumiem skatiet CMC (nozīmējums). Datorizēta saziņa (CMC) ir definēta kā jebkura saziņas transakcija, kas notiek, izmantojot divus vai vairākus tīklā savienotus datorus. Lai gan šis termins tradicionāli ir apzīmēts ar tiem… … Wikipedia

    Wiki programmatūras salīdzinājums- Šajās tabulās ir salīdzināta vispārīgā un tehniskā informācija vairākām wiki programmatūras pakotnēm. Saturs 1 Vispārīga informācija 2 Mērķauditorija 3 Funkcijas 1 4 Funkcijas 2 … Wikipedia

    Zinātniskā Skywriting- ir kognitīvā zinātnieka Stīvena Harnada izdomāts termins, kas apraksta vairāku e-pasta un tēmas pavedienu tīmekļa arhīva, piemēram, intereškopas, elektronisko adresātu sarakstu, hiperpastu, netnews vai interneta forumu, kombināciju, kas ir saistīta un kārtojama pēc datuma,… … Wikipedia

    Sadarbības lēmumu pieņemšanas programmatūra- Sadarbības lēmumu pieņemšanas (CDM) programmatūra ir programmatūras lietojumprogramma vai modulis, kas koordinē funkcijas un līdzekļus, kas nepieciešami, lai savlaicīgi pieņemtu kolektīvus lēmumus, ļaujot visām attiecīgajām ieinteresētajām personām piedalīties procesā. ... ... Vikipēdija

Nesen izmēģināju pthreadus un biju patīkami pārsteigts – tas ir paplašinājums, kas pievieno iespēju strādāt ar vairākiem reāliem pavedieniem PHP. Nekādas emulācijas, nekādas maģijas, nekādu viltojumu — viss ir īsts.



Es apsveru šādu uzdevumu. Ir uzdevumu kopums, kas ātri jāpabeidz. PHP ir citi rīki šīs problēmas risināšanai, tie šeit nav minēti, raksts ir par pthreadiem.



Kas ir pthreads

Tas arī viss! Nu, gandrīz viss. Patiesībā ir kaut kas, kas var apbēdināt zinātkāro lasītāju. Nekas no tā nedarbojas standarta PHP, kas kompilēts ar noklusējuma opcijām. Lai izbaudītu vairākpavedienu izmantošanu, jūsu PHP ir jāiespējo ZTS (Zend Thread Safety).

PHP iestatīšana

Tālāk PHP ar ZTS. Nepievērsiet uzmanību tik lielai izpildes laika atšķirībai, salīdzinot ar PHP bez ZTS (37.65 pret 265.05 sekundes), PHP iestatījumus nemēģināju vispārināt. Gadījumā, ja nav ZTS, man, piemēram, ir iespējots XDebug.


Kā redzat, izmantojot 2 pavedienus, programmas izpildes ātrums ir aptuveni 1,5 reizes lielāks nekā lineārā koda gadījumā. Lietojot 4 pavedienus - 3 reizes.


Varat atzīmēt, ka, lai gan procesors ir 8 kodolu, programmas izpildes laiks gandrīz nemainījās, ja tika izmantoti vairāk nekā 4 pavedieni. Šķiet, ka tas ir saistīts ar to, ka manam procesoram ir 4 fiziski kodoli, lai skaidrība būtu diagramma.


Atsākt

PHP ir iespējams diezgan eleganti strādāt ar multithreading, izmantojot paplašinājumu pthreads. Tas nodrošina ievērojamu produktivitātes pieaugumu.

Tagi: pievienojiet atzīmes

Manas labas draudzenes mamma lidojumā no Sanktpēterburgas uz Maskavu pazaudēja koferi, un viņai bija tālāks lidojums uz siltākiem krastiem, un nu viņa jau bija kūrortā - bez peldkostīma, sandalēm un tikai ar T. -krekls no viņas rokas bagāžas. Veco laiku labad es viņai devu pāris padomus, ko darīt un kur skriet, un šodien nolēmu šeit uzrakstīt visu, ko zinu par konkrēto tēmu.

Lai paskaidrotu, kur es esmu tik gudrs, atgādināšu, ka savulaik strādāju vairākās aviokompānijās zemes dienestos, tostarp risinot atsevišķus ar bagāžas meklēšanu saistītus jautājumus. Protams, plus mana lidojumu pieredze. Tomēr, jo Pirms vairākiem gadiem aizgāju no aviācijas servisa nozares, iespējams, kādas nianses varētu būt mainījušās - ja tā, tad ar pateicību pieņemšu komentārus par tēmu un izlabošu ierakstā esošo informāciju.

Sākšu ar šo Kas jums jādara, lai jūsu bagāža nepazustu:
1. Noplēš no čemodāna visas birkas un uzlīmes no iepriekšējiem braucieniem, pat mazās ar svītrkodu, kuras bieži vien tiek pielīmētas atsevišķi pie paša kofera – tās var sajaukt automātisko bagāžas skenēšanas un šķirošanas sistēmu.
2. Piekariet uz sava čemodāna (soma, kaste, iepakojums - viss, ko reģistrējat kā bagāžu) vārda zīmi: varat iepriekš iegādāties atkārtoti lietojamu opciju vai paņemt papīra zīmīti pie reģistrācijas letes - parasti viss puspieklājīgas aviokompānijas tās izsniedz bez ierobežojumiem . Un, piemēram, Emirates parasti ir lieliskas plastmasas etiķetes uz izturīga vada, kas var kalpot ļoti ilgu laiku:

Vecie paranoiķi var rīkoties tāpat kā es: man vienmēr pie čemodāna karājas atkārtoti lietojama plastmasas birka no Samsonite komplekta ar manu pastāvīgo mājas adresi, tālruņa numuru un pa e-pastu, un, lidojot kaut kur atvaļinājumā, papildus piekaru papīra zīmīti, kurā norādu uzturēšanās datumus jaunajā vietā un visus iespējamos kontaktus (viesnīcas nosaukums un adrese, tās vietējais telefona numurs, ja tāds ir, un mans vārds un uzvārds, protams).
3. Pie reģistrācijas letes pārliecinieties, vai bagāžai ir piestiprināta reģistrācijas aģenta izdrukātā bagāžas zīme - ar pilsētas kodu, uz kuru lidojat, un lidojuma numuru.
4. Ja jums ir vairāki lidojumi ar pārsēšanos, pastāstiet par to reģistrācijas aģentam un norādiet, uz kuru vietu vēlaties reģistrēt savu bagāžu. Dažos gadījumos bagāža būs jāpaņem vienā vai otrā maršruta lidostā neatkarīgi no jūsu vēlmes: tas attiecas, piemēram, uz transfēriem starp lidostām (Orlī un Šarla de Golla Parīzē, Domodedovo - Šeremetjevo - "Vnukovo " Maskavā), atsevišķi termināļi (termināli 1 un 2 Frankfurtē) vai pirmajā ielidošanas punktā ASV vai Meksikā - tā ir muitas prasība šajās valstīs: pieņemsim, ka lidojat Maskava-Vašingtona-Fēniksa, bagāžas zīme tiek izsniegts visiem trim segmentiem uz Fīniksu, bet Vašingtonā bagāža būs fiziski jāpaņem, jāveic muitošana un vēlreiz jāreģistrējas. Turklāt, ja reģistrējat bērnu ratiņus, kurus jums bija atļauts paņemt līdzi lidmašīna vai dzīvnieks, iespējams, tas būs jāpaņem tranzīta punktā. Kopumā sarežģītā maršrutā ar pārsēšanās gadījumiem labāk ir precizēt informāciju par bagāžas pārvietošanu iepriekš aviokompānijas zvanu centrā vai, ārkārtējos gadījumos, reģistrējoties.
5. Padariet savu bagāžu redzamu: bagāžas aizkavēšanās ne vienmēr ir bagāžas apstrādātāju vai šķirošanas sistēmas kļūdu vaina. Reizēm kāds cits izklaidīgs pasažieris, noguris pēc garā lidojuma, no bagāžas lentes paņem tādu pašu melnu Samsonite vai neaprakstāmu sporta somu kā jūsējā. Tāpēc atzīmējiet savu bagāžu: piekariiniet uz roktura ķekaru košu lentu vai nelielu mīkstu rotaļlietu, uzlīmējiet uz tās lielu uzlīmi vai vienkārši dodiet priekšroku neparastai krāsai, izvēloties koferi.

Ko nedrīkst reģistrēt bagāžā?
Atcerieties, ka visas aviosabiedrības un lidostas pazaudē bagāžu. Protams, statistika katram ir atšķirīga, taču pat uzticamākās aviokompānijas var pazaudēt vai aizkavēt bagāžu, turklāt pat vismazākajā lidostā, kur viens bagāžas apstrādātājs nogādās ratiņus ar koferiem tieši no reģistrācijas letes uz lidmašīnu. Tāpēc iesaku vienmēr ņemt līdzi rokas bagāžu:
- svarīgi dokumenti, arī tie, kas nav nepieciešami lidojuma laikā (piemēram, pēdējā braucienā uz Sanktpēterburgu man vajadzēja nomainīt apliecību, un es rokas bagāžā paņēmu līdzi laulības apliecību un visādas kartes no plkst. autoskola)
- atslēgas (kopā ar tagu ar jūsu adresi, tas var būt bīstami)
- nauda, ​​rotaslietas (bez komentāriem)
- dārgs trausls aprīkojums
- medikamentus, ko lietojat regulāri, lidojumam nepieciešamajā daudzumā un ar nelielu rezervi gadījumam, ja analogs jāmeklē svešā valstī vai pilsētā. Recepšu medikamentus, kurus nevar iegādāties bagāžas nozaudēšanas gadījumā, ņemiet līdzi visam ceļojumam nepieciešamajā daudzumā.
- kaut kas, kas var būt steidzami nepieciešams pēc ierašanās (piemēram, lādētājs telefonam
- kaut kas, kam ir sentimentāla vērtība jums personīgi: dažreiz bagāža pazūd uz visiem laikiem, un, ja pazaudējot personīgo dienasgrāmatu, jums salauž sirdi, labāk to atstāt mājās vai ņemt līdzi lidmašīnā.

Pamācošs stāsts: manā darba laikā Lufthansa Sanktpēterburgā uz mūsu ofisu ieskrēja precēts pāris no ASV, lauzīdams rokas - nebija atnākusi viņu bagāža, kurā bija ļoti svarīgi dokumenti adopcijas procesam, tiesa bija nākamajā dienā. Protams, aviokompānija ir vainīga pie bagāžas nozaudēšanas, bet kam tas ir izdevīgi? Lai izvairītos no šādas situācijas, pietika vienkārši ielikt svarīgus papīrus rokas bagāžā.

Tātad, jūs ieradāties un neatradāt savu bagāžu uz bagāžas lentes. Ko darīt?
1. Ja bagāžā reģistrējāt ko citu, nevis parastos koferus: slēpes, čellu, sienas izmēra plazmas paneli, bērnu ratiņus, dzīvā marmora dogu, pārbaudiet, vai nav atsevišķs punkts t.s. lielgabarīta bagāža vai Lielgabarīta bagāža - bagāža, kas līdzīga iepriekš aprakstītajai, bieži tiek iekrauta atsevišķā nodalījumā un izkrauta atsevišķi, manuāli. Ja arī jūsu bagāža tur nav atrasta
2. Dodieties uz bagāžas izsekošanas vai Lost & Found leti. Tur jums būs jāaizpilda īpaša veidlapa ar detalizēta informācija par jūsu bagāžu: maršruts, izskats, īss satura saraksts, jūsu kontakti jūsu pastāvīgajā dzīvesvietā un pagaidu uzturēšanās vietā. Turklāt bagāžas izsekošanas pakalpojumā jūs, visticamāk, redzēsit šādu bagāžas tabulu:

Tieši saskaņā ar šo klasifikāciju jūsu pazudusī bagāža tiks kodēta, un, lai jūs saprotat, šie divi koferi tiks kodēti vienādi:

Tāpēc nekautrējieties pievienot papildu informāciju aprakstā un neizlaidiet satura klauzulu. Parasti, pirmo reizi aizpildot bagāžas aizkavēšanās ziņojumu, jums tiks lūgts norādīt vairākas satura vienības, pēc kurām var atpazīt jūsu somu, ja ārpusē nav identifikācijas zīmju un soma būs jāatver (ja soma ir atvērta, jūs par to ievietosit paziņojumu). Slikts piemērs: T-krekls / grāmata / mitrās salvetes, labs piemērs: spilgti sarkans bikini / Maleviča reprodukciju katalogs / saliekamais gludeklis. Pēc pieteikuma aizpildīšanas bagāžas izsekošanas dienesta darbinieks jums piešķirs numuru formātā XXXYY11111, kur XXX ir ielidošanas lidostas kods, YY ir ielidošanas aviokompānijas kods + 5 pieteikuma sērijas numura cipari: piemēram, JFKLH12345, ja jūs ar Lufthansa lidojāt uz Kenedija lidostu Ņujorkā. Atcerieties vai pierakstiet šo numuru – tas būs vienkāršākais veids, kā turpmākajās pieteikumos atrast savu pieteikumu.
Izmantojot to pašu numuru, varat PATS pārbaudīt meklēšanas statusu (nez kāpēc saite pazūd: ja jums tas neder, google World Tracer Online un burtiski otrā saite - ar virsrakstu Bagāžas izsekošana vietnē worldtracer.aero - ir tas, kas jums nepieciešams), jo, lai nokļūtu pa lost&found. bieži ir ļoti grūti
3. Mēģiniet sazināties ar savas aviokompānijas biroju ielidošanas lidostā: dažreiz (uzsveru - REIZI!), ja neesat lidojis mājās, bet gan uz pagaidu uzturēšanās vietu (atvaļinājums, komandējums), aviokompānija var nodrošināt komplektu. tualetes piederumu (Lufthansa ir iekļāvusi lielizmēra T-kreklu, zobu birsti un pastu, ķemmi, mazos šampūna un dušas želejas iepakojumus, veļas pulvera paciņu utt.) vai veikt nelielu skaidras naudas maksājumu par sīkiem izdevumiem uz vietas. (maksa skaidrā naudā uz vietas).

Kas notiks tālāk?
Jūsu fails (tā sauktais AHL) nonāks centralizētajā bagāžas meklēšanas sistēmā (World Tracer). Visas neizņemtās bagāžas vienības ietilpst vienā meklēšanas sistēmā neatkarīgi no tā, vai tās tika atrastas bez atzīmes bagāžas novietnes stūros vai palika uz bagāžas lentes, fails formātā XXXYY11111 arī radīts, tikai cita apakštipa - t.s. uz rokas ziņojumu vai OHD. Ja dati no AHL un OHD failiem sakrīt (uzvārds, čemodāna apraksts, maršruts utt.), abas stacijas (kur tika ziņots par bagāžas nozaudēšanu un kur tika atrasta neizņemtā bagāža) saņems paziņojumu, un pēc tam tas ir tehnoloģiju jautājums: atkārtota pārbaude un veiksmes gadījumā bagāžas pārsūtīšana uz vēlamo pilsētu. Protams, liels skaits paštaisīts- ziņojumapmaiņa, līdzīgu, bet ne vienādu koferu noraidīšana, kā arī atbildes uz vairākiem telefona zvani- kopumā bagāžas meklēšanas dienesta darbiniekiem nekad nav garlaicīgi.
Aptuvenā statistika: vairāk nekā 90% no nozaudētās bagāžas tiek atrasti pirmajās 3 meklēšanas dienās, 3% tiek pazaudēti uz visiem laikiem.
Ko jūs varat darīt?
1. Ja ierodoties ir jāiegādājas kaut kas steidzami nepieciešams (no zobu birstes līdz lietišķajam kostīmam), noteikti saglabājiet čekus vēlākai kompensācijai. Tomēr jums vajadzētu izvairīties no nevajadzīgiem dārgiem pirkumiem, es paskaidrošu, kāpēc vēlāk.
2. Veicot jaunas darbības, izveidojiet visdetalizētāko satura sarakstu, vēlams ar krāsu, zīmolu un aptuvenās izmaksas katru preci, ideālā gadījumā angļu valodā (pretējā gadījumā aviokompānijas darbiniekam šis saraksts būs jātulko, lai iekļūtu sistēmā), sazinieties ar aviokompāniju un nosūtiet viņiem šo sarakstu, tas tiks pievienots bagāžas meklēšanas lietojumprogrammai. Pirmās 5 dienas bagāžas meklēšanu veic ielidošanas lidosta, pēc tam par meklēšanu atbild pārvadātāja aviokompānija (pieteikuma numurā norādītā aviokompānija - atcerieties JFKLH12345?), un pēc 21 dienas jūs var pretendēt uz galīgo kompensāciju.
3. Ja pēc 21 dienas no paziņojuma par bagāžas nozaudēšanu iesniegšanas datuma tā nav atrasta, sazinieties ar pārvadātāja aviokompāniju, lai pieprasītu kompensāciju. Ja nemaldos, tad noilgums ir 2 gadi, t.i. Pieteikties uz atlīdzību var divu gadu laikā no zaudējuma prasības pieteikšanas dienas.

Kompensācijas izmaksa.
Lai izmaksātu kompensāciju, jums būs jāsazinās ar savas aviokompānijas pārstāvniecību ar maksājuma pieteikumu, lidojumu un bagāžas nozaudēšanas faktu apliecinošiem dokumentiem (iekāpšanas kartes, bagāžas birkas, prasības numurs par bagāžas nozaudēšanu, maksājuma rekvizīti). Ja nemaldos, Krievijas Federācijā lēmums par kompensāciju ir juridiski jāizskata 30 dienu laikā. Jums var arī lūgt aplēst satura izmaksas un, ja iespējams, iesniegt čekus par čemodāna un tajā esošo priekšmetu iegādi (es saprotu, ka vairumā gadījumu tas ir nereāli, bet tā ir daļa no procedūras).
Iepriekš maksājumi tika veikti pēc nododamās bagāžas svara – aptuveni 20 USD par kilogramu. Vēlāk tika mainīta norēķinu sistēma un aviokompāniju atbildība tika ierobežota līdz 1000 parastajām vienībām (parastās vienības izmaksas tiek aprēķinātas aviokompānijas ietvaros), kas manā darba laikā atbilda aptuveni 1300 eiro. Tie. pat ja paņemsiet līdzi čeku par Louis Vuitton kofera iegādi, kas izgatavots no tūkstoš Bolīvijas gekonu ādām un pildīts ar dimantiem, jūs nesaņemsiet vairāk par 1300 eiro.