Otthon / Internet / Anémiás vitaszál php. Többszálú számítástechnika PHP-ben: pthreads. Mik azok a pthreadek

Anémiás vitaszál php. Többszálú számítástechnika PHP-ben: pthreads. Mik azok a pthreadek

Úgy tűnik, hogy a PHP-fejlesztők ritkán használják a párhuzamosságot. Nem beszélek a szinkron kód egyszerűségéről az egyszálú programozás természetesen egyszerűbb és áttekinthetőbb, de néha kis használat a párhuzamosság jelentős teljesítményjavulást hozhat.

Ebben a cikkben megvizsgáljuk, hogyan érhető el többszálas működés a PHP-ben a pthreads kiterjesztéssel. Ehhez telepítenie kell a PHP 7.x ZTS (Zend Thread Safety) verzióját, valamint telepített bővítmény pthreads v3. (A cikk írásakor a PHP 7.1-ben a felhasználóknak a fő ágból kell telepíteniük a pthreads tárolóban – lásd a harmadik féltől származó kiterjesztést.)

Egy kis pontosítás: a pthreads v2 a PHP 5.x-hez készült, és már nem támogatott, a pthreads v3 a PHP 7.x-hez való, és jelenleg is folyik a fejlesztés.

Egy ilyen kitérő után térjünk is közvetlenül a lényegre!

Egyszeri feladatok feldolgozása

Néha az egyszeri feladatokat többszálas módon szeretné feldolgozni (például valamilyen I/O-kötött feladat végrehajtása). Ilyen esetekben használhatja a Thread osztályt egy új szál létrehozására, és egy külön szálon futtathat feldolgozást.

Például:

$task = új osztály kiterjeszti a szálat ( privát $válasz; public function run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $tartalom, $egyezések); $this->response = $egyezik; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) "Google"

Itt a futási metódus a mi feldolgozásunk, amely egy új szálon belül kerül végrehajtásra. A Thread::start meghívásakor egy új szál jön létre, és meghívódik a futtatási metódus. Ezután visszakapcsoljuk a gyermekszálat a főszálhoz a Thread::join meghívásával, amely addig blokkol, amíg a gyermekszál végrehajtása be nem fejeződik. Ez biztosítja, hogy a feladat végrehajtása befejeződjön, mielőtt megpróbálnánk kinyomtatni az eredményt (amely a $task->response mappában van tárolva).

Előfordulhat, hogy nem kívánatos egy osztályt az áramlási logikához kapcsolódó további felelősségekkel szennyezni (beleértve a futtatási módszer meghatározásának felelősségét). Az ilyen osztályokat úgy tudjuk megkülönböztetni, hogy örököljük őket a Threaded osztálytól. Ezután egy másik szálon belül futtathatók:

Az osztályfeladat kiterjeszti a szálakat ( publikus $válasz; nyilvános függvény someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->response = $egyezik ) ) $task = new Task; $thread = new class($task) kiterjeszti Thread ( privát $feladat; public function __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork( ) ) ); $thread->start() && $thread->join(); var_dump($feladat->válasz);

Minden olyan osztály, amelyet külön szálban kell futtatni kellörökölni a Threaded osztályból. Ennek az az oka, hogy biztosítja a szükséges képességeket a különböző szálakon történő feldolgozáshoz, valamint implicit biztonságot és hasznos interfészeket (például erőforrás-szinkronizálást).

Vessünk egy pillantást a pthreads kiterjesztés által kínált osztályhierarchiára:

Menetes (átjárható, gyűjthető) Thread Worker Volatile Pool

A Thread és a Threaded osztályok alapjait már leírtuk és megtanultuk, most vessünk egy pillantást a másik háromra (Worker, Volatile és Pool).

Szálak újrafelhasználása

Egy új szál indítása minden párhuzamosítandó feladathoz meglehetősen költséges. Ennek az az oka, hogy a pthread-ekben közös-semmi architektúrát kell megvalósítani a többszálú PHP-n belüli megvalósításhoz. Ez azt jelenti, hogy a PHP értelmező aktuális példányának teljes végrehajtási környezetét (beleértve minden osztályt, interfészt, tulajdonságot és függvényt) át kell másolni minden létrehozott szálhoz. Mivel ennek észrevehető hatása van a teljesítményre, az adatfolyamot mindig újra fel kell használni, amikor csak lehetséges. A szálak kétféleképpen használhatók fel újra: Workers vagy Pools használatával.

A Worker osztály számos feladat szinkron végrehajtására szolgál egy másik szálon belül. Ez úgy történik, hogy létrehoz egy új Worker-példányt (ami egy új szálat hoz létre), majd a feladatokat a különálló szál veremébe helyezi (a Worker::stack használatával).

Íme egy kis példa:

Az osztályfeladat kiterjeszti a szálakat ( privát $érték; nyilvános függvény __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $dolgozó = new Dolgozó(); $dolgozó->start(); for ($i = 0; $i verem(new Task($i)); ) while ($worker->collect()); $dolgozó->leállítás();

A fenti példában 15 feladat egy új $worker objektumhoz kerül a verembe a Worker::stack metóduson keresztül, majd azokat a leküldés sorrendjében dolgozza fel. A Worker::collect metódus, amint az fent látható, a feladatok megtisztítására szolgál, miután azok végrehajtása befejeződött. Ezzel egy while cikluson belül blokkoljuk a főszálat, amíg a veremben lévő összes feladat be nem fejeződik és törlődik – mielőtt meghívnánk a Worker::shutdown parancsot. Egy dolgozó korai leállítása (azaz amíg vannak még elvégzendő feladatok) továbbra is blokkolja a fő szálat mindaddig, amíg az összes feladat be nem fejezi a végrehajtását, csak hogy a feladatokat ne gyűjtsék össze (ami memóriaszivárgást jelent).

A Worker osztály számos más módszert is kínál a feladatveremhez, beleértve a Worker::unstacket az utolsó halmozott feladat eltávolításához és a Worker::getStackedet a végrehajtási veremben lévő feladatok számának lekéréséhez. A dolgozói verem csak azokat a feladatokat tartalmazza, amelyeket végre kell hajtani. Ha egy feladat a veremben elkészült, azt eltávolítjuk, és egy külön (belső) verembe helyezzük szemétgyűjtés céljából (a Worker::collect módszerrel).

A szálak több feladaton keresztüli újrafelhasználásának másik módja egy szálkészlet használata (a Pool osztályon keresztül). A szálkészlet Workers csoportot használ a feladatok végrehajtásának lehetővé tételére egyidejűleg, amelyben a párhuzamossági tényező (az általa használt készletszálak száma) a készlet létrehozásakor van beállítva.

Alakítsuk át a fenti példát a dolgozók csoportjának használatához:

Az osztályfeladat kiterjeszti a szálakat ( privát $érték; nyilvános függvény __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $pool = new Pool(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $pool->shutdown();

Van néhány figyelemreméltó különbség a pool és a dolgozó használatakor. Először is, a készletet nem kell manuálisan elindítani, azonnal megkezdi a feladatok végrehajtását, amint azok elérhetővé válnak. Másodszor, mi elküld feladatokat a medencéhez, nem rakd fel őket egy veremre. Ezenkívül a Pool osztály nem örökli a Threaded osztályt, ezért nem adható át más szálaknak (ellentétben a Workerrel).

Az a bevált gyakorlat, hogy a dolgozók és a csoportok mindig megtisztítják a feladataikat, amint befejezték, majd saját maguk fejezik be azokat. A Thread osztály használatával létrehozott szálakat is csatolni kell a szülőszálhoz.

pszálak és (im)változatlanság

Az utolsó osztály, amelyet érinteni fogunk, a Volatile, a pthreads v3 új kiegészítése. A megváltoztathatatlanság fontos fogalommá vált a pszálakban, mert enélkül a teljesítmény jelentősen csökken. Ezért alapértelmezés szerint a Threaded osztályok tulajdonságai, amelyek maguk is Threaded objektumok, mostantól megváltoztathatatlanok, és ezért nem írhatók felül a kezdeti hozzárendelésük után. Az ilyen tulajdonságok explicit mutációja jelenleg előnyben részesített, és továbbra is elérhető az új Volatile osztály használatával.

Nézzünk egy példát, amely bemutatja az új megváltoztathatatlansági korlátozásokat:

Az osztályfeladat kiterjeszti a Threaded // a Threaded osztályt ( nyilvános függvény __construct() ( $this->data = new Threaded(); // A $this->data nem írható felül, mivel egy szálas osztály Threaded tulajdonsága) ) $task = new class(new Task()) kiterjeszti a szálat ( // egy szálas osztály, mivel a szál kiterjeszti a szálas nyilvános függvényt __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> adat);

A volatile osztályok szálas tulajdonságai viszont változtathatók:

Az osztályfeladat kiterjeszti a Volatile-t ( nyilvános függvény __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // érvényes, mivel volatile osztályban vagyunk ) ) $task = new class(new Task()) kiterjeszti a szálat ( nyilvános függvény __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // továbbra is érvénytelen, mivel a Volatile kiterjeszti a Threaded-et, így a tulajdonság még mindig egy Threaded osztály Threaded tagja $this->volatileMember = new StdClass() );

Láthatjuk, hogy a Volatile osztály felülírja a szülő Threaded osztály által előírt megváltoztathatatlanságot, hogy lehetővé tegye a Threaded tulajdonságok megváltoztatását (valamint unset()).

Van még egy vita tárgya a variabilitás és a volatile osztály – tömbök témájával. A pthread-ekben a tömbök automatikusan átkerülnek a volatile objektumokhoz, ha a Threaded osztály egy tulajdonságához vannak hozzárendelve. Ennek az az oka, hogy egyszerűen nem biztonságos több PHP kontextusból álló tömb manipulálása.

Nézzünk még egyszer egy példát, hogy jobban megértsünk néhány dolgot:

$tömb = ; $task = new class($array) kiterjeszti Thread ( privát $adat; nyilvános függvény __construct(array $tömb) ( $this->data = $tömb; ) public function run() ( $this->data = 4; $ this->data = 5 print_r($this->data) ); $feladat->start() && $feladat->join(); /* Kimenet: illékony objektum ( => 1 => 2 => 3 => 4 => 5) */

Látjuk, hogy az illékony objektumokat úgy lehet kezelni, mintha tömbök lennének, mert támogatják a tömbműveleteket, például (amint fentebb látható) a subset() operátor. A Volatile osztályok azonban nem támogatják az olyan alapvető tömbfüggvényeket, mint az array_pop és az array_shift. Ehelyett a Threaded osztály beépített metódusként biztosít számunkra ilyen műveleteket.

Bemutatóként:

$adat = új osztály kiterjeszti Volatile ( nyilvános $a = 1; nyilvános $b = 2; nyilvános $c = 3; ); var_dump($adat); var_dump($adat->pop()); var_dump($adat->shift()); var_dump($adat); /* Kimenet: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) object(class@anonymous)#1 (1) ( ["b"]=> int(2) ) */

Egyéb támogatott műveletek közé tartozik a Threaded::chunk és a Threaded::merge .

Szinkronizálás

A cikk utolsó részében a pthread-ekben történő szinkronizálást fogjuk megvizsgálni. A szinkronizálás egy olyan módszer, amely lehetővé teszi a megosztott erőforrásokhoz való hozzáférés szabályozását.

Például valósítsunk meg egy egyszerű számlálót:

$számláló = új osztály kiterjeszti a szálat ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $számláló->start(); for ($i = 0; $i i; ) $counter->join(); var_dump($számláló->i); // 10 és 20 közötti számot nyomtat

Szinkronizálás nélkül a kimenet nem determinisztikus. Több szál ír ugyanarra a változóra ellenőrzött hozzáférés nélkül, ami azt jelenti, hogy a frissítések elvesznek.

Javítsuk ki, hogy az időzítés hozzáadásával a megfelelő 20-as kimenetet kapjuk:

$számláló = new class kiterjeszti Thread ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $számláló->start(); $számláló->szinkronizált(függvény ($számláló) ( for ($i = 0; $i i; ) ), $számláló); $counter->join(); var_dump($számláló->i); int(20)

A szinkronizált kódblokkok a Threaded::wait és Threaded::notify (vagy Threaded::notifyAll) metódusokkal is kommunikálhatnak egymással.

Itt van egy alternatív növekmény két szinkronizált while ciklusban:

$számláló = új osztály kiterjeszti Thread ( public $cond = 1; public function run() ( $this->synchronized(function ()) ( for ($i = 0; $i notify();); if ($this->cond === 1) ( $this->cond = 2; $this->wait(); ) ) )); $számláló->start(); $counter->synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // várja meg, míg a másik indul először ) for ($i = 10; $i notify(); $counter->join(); /* Kimenet: 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) */

A Threaded::wait hívása körül további feltételeket is észlelhet. Ezek a feltételek kritikusak , mert lehetővé teszik a szinkronizált visszahívás folytatását , ha értesítést kapott , és a megadott feltétel igaz . Ez azért fontos, mert az értesítések más helyekről is érkezhetnek, mint a Threaded::notify meghívásakor. Így ha a Threaded::wait metódus hívásai nem lennének feltételekkel zárva, akkor végrehajtjuk hamis ébresztők, ami kiszámíthatatlan kódviselkedéshez vezet.

Következtetés

Megnéztük a pthreads csomag öt osztályát (Threaded, Thread, Worker, Volatile és Pool) és az egyes osztályok használatát. Megvizsgáltuk a változtathatatlanság új koncepcióját a pthread-ekben, készült rövid áttekintés támogatott szinkronizálási lehetőségek. Ha ezekkel az alapokkal a helyükön van, elkezdhetjük megvizsgálni, hogyan használhatók a pthreadek valós esetekben! Ez lesz a következő bejegyzésünk témája.

Ha érdekel a következő bejegyzés fordítása, jelezd: kommentelj a közösségi oldalakon. hálózatokon, szavazzon pozitívan, és ossza meg a bejegyzést kollégáival és barátaival.

Menetes vita

A menetes vita elektronikus megbeszélés (például e-mailben, e-mail lista, faliújság , hírcsoport vagy internetes fórum), amelyben a szoftver az üzenetek vizuális csoportosításával segíti a felhasználót. Az üzenetek általában vizuálisan, téma szerint hierarchiába vannak csoportosítva. Az így csoportosított üzenetek halmazát a témaszál vagy egyszerűen "szál". Egy vitafórumról, e-mail kliensről vagy hírkliensről azt mondják, hogy "szálba kötött témái" vannak, ha az azonos témájú üzeneteket csoportosítja, hogy így könnyebben olvasható legyen. Ezen túlmenően a szálas megbeszélések általában lehetővé teszik a felhasználók számára, hogy egy témaszálon belül egy bizonyos bejegyzésre válaszoljanak. Ennek eredményeként a szál témáján belül a beszélgetések hierarchiája alakulhat ki. Különféle szoftvertípusok lehetővé tehetik, hogy ez a hierarchia megjelenjen a témakörben. Menetes módnak hívják. (Az alternatíva a Lineáris mód, amely jellemzően az összes bejegyzést dátum szerinti sorrendben mutatja, függetlenül attól, hogy ki konkrétan kinek válaszolt.)

Előnyök

A hierarchikus szálú nézetek előnye, hogy lehetővé teszik az olvasó számára, hogy gyorsan felmérje a beszélgetés általános szerkezetét: konkrétan, hogy ki kinek válaszol. Mint ilyen, a leghasznosabb olyan helyzetekben, ahol kiterjedt beszélgetések vagy viták, például hírcsoportok vannak: valóban összetett viták esetén gyorsan lehetetlenné válik az érvelés követése valamilyen hierarchikus szálrendszer nélkül.

Egy másik előny a közösség finomabb megbecsülésében rejlik a hierarchikus szálú rendszerekben. Mivel konkrét bejegyzésekre kell válaszolni, konkrét személyeknek is meg kell válaszolni. A szálas beszélgetések ezért általában a megválaszolt egyén sajátos nézeteire és személyiségére összpontosítják az írót. Ez kevésbé fordul elő azokon a fórumokon, ahol a legfrissebb megjegyzést csak beillesztik az általános készletbe.

Hátrányok

A hierarchikus menetezés hátránya a lapos menettel szemben a megnövekedett bonyolultság, ezért az ilyen nézet fokozott kényelmet és kifinomultságot igényel a felhasználók részéről. Ezért nem meglepő, hogy a legrégebbi és/vagy legkifinomultabb online közösségekben, például a Usenetben, a CIX-ben vagy a Slashdotban volt a legerősebb. A webes csevegő- és megjegyzésrendszerek ehhez képest fiatalabbak és nyitottak a szélesebb közönség számára, és mint ilyen, a hierarchikus szálépítés csak mostanában válik általánossá az ilyen színtereken.

A fahierarchia felépítése hajlamos a témán belüli viták széttöredezésére is: többé nem lehet több különböző korábbi bejegyzésre reagáló vagy összefoglaló üzenetet közzétenni. Ehelyett minden korábbi bejegyzésre külön kell válaszolni. Vitatható, hogy ez konfrontatívabb vitastílushoz vezet azokon a fórumokon, amelyek hierarchikus szálakat használnak. Bár igaz is legyen, ha a kívánt bejegyzésre érkezett válaszok nagy száma miatt már nem lehetséges a közvetlen szálba kötött válasz, a felhasználók mostanában gyakran használnak idézeteket attól a személytől, akinek válaszolnak, hogy a beszélgetést rendben tartsák és folytassák. simán A legtöbb üzenőfali közösség ezt javasolja arra az esetre, ha a szálak összefűzése elérte az egyébként átfogó határt.

Nyissa meg a szálat

A nyitott szál egy blogbejegyzésre utal, amelyhez az olvasók hozzászólhatnak és megvitathatják az általuk választott témát. Általában hasznosabbak a népszerű blogokon, ahol nagy mennyiségű forgalom; gyakran használják őket, ha a blog szerzőjének nincs témája a bejegyzéshez, vagy ha szünet van a közzétételben.

A nyitott szálakat arra is használják, hogy megtörjék a bejegyzések monotóniáját a blogok főoldalain. A tartalomorientált bejegyzéseken megjegyzések gyűlhetnek fel; ezért a szerzők a nyitott szálakat használják, így az oldal betöltési ideje nem csökken.

Példák

*Jehu! Csoportok [ http://groups.yahoo.com/], MSN csoportok [ http://groups.msn.com/] és Slashdot [ http://www.slashdot.com/] mindegyik webalapú fórumot kínál, amelyeken szálonkénti beszélgetések találhatók.

Lásd még

* Tudományos Skywriting
* A blogolási kifejezések listája

Hivatkozások

*Dartmouth. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "A vita online felvétele" ]
*Wolsey, T. DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Irodalmi vita a kibertérben: Fiatal serdülők menetes vitacsoportokat használva a könyvekről való beszélgetéshez] . "Reading Online", 7(4), 2004. január/február. Letöltve: 2007. december 30.

Wikimédia Alapítvány.

  • 2010.
  • Leon Powe

Barh Azoum

    Nézd meg a többi szótárat: Internetes fórum

    - A phpBB Internet Forum szoftvercsomag, az egyik legnépszerűbb fórumcsomag… Wikipédia A virtuális tanulási környezetek története 1990-es évek

    - A virtuális tanulási környezetek történetében az 1990-es évek a növekedés időszaka volt, elsősorban a megfizethető számítógép és az internet megjelenése miatt.1990-es évek1990* Formal Systems Inc. Princeton, NJ, USA bevezet egy DOS alapú értékelést… … Wikipédia- Együttműködő Szemtől szemben Oktatási Környezet Fejlesztő(k) Vezetői konzorcium Stabil kiadás 5.0 / 2010. június Operációs rendszer Több platform… Wikipédia

    Beszélgetés szálfűzése- számos e-mail kliens, hirdetőtábla, hírcsoport vagy internetes fórum által használt szolgáltatás, amelyben a szoftver az üzenetek vizuális csoportosításával segíti a felhasználót. Az üzenetek általában vizuálisan, téma szerint hierarchiába vannak csoportosítva. Üzenetek csoportja... ... Wikipedia

    Slashdot- Képernyőkép a Slashdot.org főoldal URL-jéről slashdot.org szlogen Hírek nerdeknek. Amik számítanak...Wikipédia

    MediaWiki- névtér átirányítja ide. A Wikipédia MediaWiki névterével kapcsolatos segítségért lásd: Súgó:MediaWiki névtér. A Wikipédia névterekkel kapcsolatos általános információkért lásd: Wikipédia:Névtér. A beszélgetési oldal és a MediaWiki beszélgetési oldal átirányítása ide. A... ... Wikipédiához

    Számítógépes kommunikáció- Az egyéb felhasználásokról lásd: CMC (egyértelműsítés). Számítógépes kommunikáció (CMC) minden olyan kommunikációs tranzakció, amely két vagy több hálózatba kapcsolt számítógép használatával történik. Míg a kifejezés hagyományosan azokra a… … Wikipédiára utal

    A wiki szoftverek összehasonlítása- A következő táblázatok összehasonlítják számos wiki szoftvercsomag általános és műszaki adatait. Tartalom 1 Általános információk 2 Célközönség 3 Szolgáltatások 1 4 Szolgáltatások 2 … Wikipédia

    Tudományos Skywriting- egy olyan kifejezés, amelyet Stevan Harnad kognitív tudós talált ki, és leírja a több e-mail és egy témaszálas webarchívum, például hírcsoport, elektronikus levelezőlista, hipermail, netnews vagy internetes fórum kombinációját, dátum szerint linkelve és rendezve,… … Wikipédia

    Együttműködésen alapuló döntéshozó szoftver- Az együttműködésen alapuló döntéshozatali (CDM) szoftver egy olyan szoftveralkalmazás vagy modul, amely összehangolja azokat a funkciókat és szolgáltatásokat, amelyek szükségesek az időben meghozandó kollektív döntések meghozatalához, lehetővé téve az összes érdekelt fél részvételét a folyamatban. A... ... Wikipédia

Nemrég kipróbáltam a pthread-eket, és kellemesen meglepődtem – ez egy olyan kiterjesztés, amely lehetőséget ad több valódi szál használatára PHP-ben. Nincs emuláció, nincs varázslat, nincs hamisítvány – minden valódi.



Ilyen feladaton gondolkodom. Van egy csomó feladat, amelyeket gyorsan kell elvégezni. A PHP-nek más eszközei is vannak a probléma megoldására, ezekről itt nincs szó, a cikk pthreadekről szól.



Mik azok a pthreadek

Ennyi! Nos, szinte mindent. Valójában van valami, ami felzaklathatja a kíváncsi olvasót. Ezek egyike sem működik az alapértelmezett beállításokkal fordított szabványos PHP-n. A többszálú használat élvezetéhez engedélyeznie kell a ZTS-t (Zend Thread Safety) a PHP-ben.

PHP beállítás

Ezután PHP ZTS-sel. Ne figyelj arra, hogy ekkora különbség van a végrehajtási időben a ZTS nélküli PHP-hez képest (37,65 vs 265,05 másodperc), nem próbáltam általánosítani a PHP beállításokat. ZTS nélküli esetben például engedélyeztem az XDebug-ot.


Amint látható, 2 szál használatakor a program végrehajtási sebessége körülbelül 1,5-szer nagyobb, mint lineáris kód esetén. 4 szál használata esetén - 3 alkalommal.


Megjegyzendő, hogy bár a processzor 8 magos, a program végrehajtási ideje 4-nél több szál használata esetén szinte változatlan maradt. Úgy tűnik, ez annak köszönhető, hogy a processzorom 4 fizikai maggal rendelkezik.


Folytatás

A PHP-ben a pthreads kiterjesztéssel meglehetősen elegánsan lehet dolgozni a többszálú kezeléssel. Ez a termelékenység észrevehető növekedését eredményezi.

Címkék: Címkék hozzáadása

Egy jó barátom édesanyja elvesztette a bőröndjét a Szentpétervárról Moszkvába tartó járaton, és volt egy további járata melegebb partokra, és most már az üdülőhelyen volt - fürdőruha, szandál nélkül és csak T-vel. -ing a kézipoggyászából. A régi idők kedvéért adtam neki egy-két tippet, hogy mit csináljon és hova futjon, és ma úgy döntöttem, hogy mindent, amit egy adott témában tudok, ide írok.

Hogy elmagyarázzam, hol vagyok ennyire okos, hadd emlékeztessem önöket arra, hogy egy időben több légitársaságnál dolgoztam földi szolgálatban, többek között bizonyos, a poggyászkereséssel kapcsolatos problémákkal is foglalkoztam. Persze plusz a saját repülési tapasztalataim. Azonban mivel Évekkel ezelőtt otthagytam a légiközlekedési szolgáltatást, talán néhány árnyalat változott - ha igen, akkor hálásan fogadom a témával kapcsolatos megjegyzéseket, és javítom a bejegyzésben található információkat.

Ezzel kezdem Mit kell tennie, hogy ne vesszen el poggyásza:
1. Tépje le bőröndjéről az összes korábbi utakról származó címkét és matricát, még a kicsi vonalkódos matricákat is, amelyeket gyakran külön ragasztanak fel magára a bőröndre - összezavarhatják az automatikus poggyászvizsgáló és -válogató rendszert.
2. Akasszon fel egy névcímkét a bőröndjére (táska, doboz, csomag - általában minden, amit poggyászként ad fel): vásárolhat előre újrahasznosítható opciót, vagy vihet papírcímkét a check-in pultnál - általában minden félig tisztességes légitársaságok korlátozás nélkül kiadják őket. És például az Emirates-nél általában kiváló műanyag címkék vannak egy tartós kábelen, amely nagyon sokáig bírja:

A régi paranoiások is úgy tudnak járni, mint én: mindig van a bőröndömön egy újrafelhasználható műanyag címke a Samsonite készletből, rajta állandó lakcímem, telefonszámom és e-mailben, és ha elrepülök valahova nyaralni, ezen felül felakasztok egy papírcédulát, amelyen feltüntetem az új helyen való tartózkodásom dátumait és az összes lehetséges elérhetőséget (a szálloda neve és címe, helyi telefonszáma, ha van, és természetesen a vezeték- és keresztnevem).
3. Az utasfelvételi pultnál győződjön meg arról, hogy poggyászára fel van ragasztva a poggyászcímke, amelyet a check-in ügyintéző nyomtat ki – a város kódjával, ahová repül, és a járatszámmal.
4. Ha több csatlakozó járata van, szóljon erről a check-in ügynöknek, és adja meg, hogy melyik pontig szeretné feladni poggyászát. Bizonyos esetekben a poggyászt az útvonal egyik vagy másik repülőterén kell felvenni, függetlenül attól, hogy az Ön kívánsága: ez vonatkozik például a repülőterek közötti transzferekre (Orly és Charles de Gaulle Párizsban, Domodedovo - Sheremetyevo - "Vnukovo " Moszkvában), külön terminálokon (Frankfurti 1-es és 2-es terminál) vagy az első érkezési ponton az USA-ban vagy Mexikóban - ez vámkövetelmény ezekben az országokban: tegyük fel, hogy Moszkva-Washington-Phoenix repül, egy poggyászcímke mindhárom szegmensre kiállítják Phoenixbe, de Washingtonban a poggyászt fizikailag fel kell venni, át kell vámkezelni és újra fel kell adni, ha olyan babakocsit adnak fel, amelyet a beszállás előtt magával vihettek repülőgépet vagy állatot, valószínűleg egy tranzitponton kell felvennie. Általánosságban elmondható, hogy összetett, átszállásokkal járó útvonalak esetén érdemes előre tisztázni a poggyászmozgatás részleteit a légitársaság telefonos ügyfélszolgálatán, vagy extrém esetben a bejelentkezéskor.
5. Tegye láthatóvá poggyászát: a poggyász késése nem mindig a poggyászkezelők hibája vagy a válogatórendszer hibája. Néha egy másik szórakozott utas, aki elfáradt egy hosszú repülés után, ugyanazt a fekete Samsonite vagy nem leírható sporttáskát veszi le a csomagtartóról, mint az Öné. Ezért jelölje meg poggyászát: akasszon fel egy csomó fényes szalagot vagy egy kis puha játékot a fogantyúra, ragasszon rá egy nagy matricát, vagy egyszerűen részesítse előnyben a szokatlan színt a bőrönd kiválasztásakor.

Mit nem szabad feladni a poggyászban?
Ne feledje, minden légitársaság és repülőtér elveszíti poggyászát. Természetesen mindenkinél más a statisztika, de még a legmegbízhatóbb légitársaságok is elveszíthetik vagy késhetnek poggyászuk, sőt a legkisebb repülőtéren is, ahol egyetlen poggyászkezelő szállítja a kocsit bőröndökkel közvetlenül a check-in pulttól a repülőig. Ezért azt tanácsolom, hogy mindig vigye magával kézipoggyászát:
- fontos dokumentumokat, beleértve azokat is, amelyekre nincs szükség a repülés során (például legutóbbi szentpétervári utam alkalmával jogosítványt kellett váltanom, és a kézipoggyászomban vittem magammal egy házassági anyakönyvi kivonatot és mindenféle kártyát autósiskola)
- kulcsok (a címét tartalmazó címkével kombinálva ez veszélyes lehet)
- pénz, ékszerek (nincs megjegyzés)
- drága, törékeny felszerelés
- rendszeresen szedett gyógyszereket, a repüléshez szükséges mennyiségben, és kis tartalékkal arra az esetre, ha analógot kellene keresnie egy idegen országban vagy városban. A poggyász elvesztése esetén nem megvásárolható vényköteles gyógyszereket vigye magával a teljes utazáshoz szükséges mennyiségben.
- valami, amire érkezéskor sürgősen szükség lehet (pl. töltő telefonhoz
- valami, aminek szentimentális értéke van az Ön számára: néha a poggyász örökre elveszik, és ha a személyes napló elvesztése összetöri a szívét, jobb, ha otthon hagyja, vagy magával viszi a repülőre

Tanulságos történet: a szentpétervári Lufthansánál végzett munkám ideje alatt egy amerikai házaspár futott be az irodánkba, kezét tördelve - nem érkezett meg az örökbefogadási tárgyaláshoz nagyon fontos dokumentumokat tartalmazó csomagjuk, a tárgyalás másnap volt. Természetesen a légitársaság a hibás a poggyász elvesztéséért, de kinek jó ez? Az ilyen helyzetek elkerülésére elég volt a fontos papírokat egyszerűen a kézipoggyászba tenni.

Tehát megérkezett, és nem találta a csomagját a poggyászszalagon. Mit tegyek?
1. Ha a poggyászában a szokásos bőröndöktől eltérőt adott fel: sílécet, csellót, fali méretű plazmapanelt, babakocsit, élőmárvány dánt, ellenőrizze, hogy van-e külön pont az ún. túlméretezett poggyász vagy ömlesztett poggyász – az általam fentebb leírthoz hasonló poggyászokat gyakran külön rekeszbe rakják, és külön, kézzel rakják ki. Ha a poggyászát ott sem találja
2. Menjen a poggyászkövető vagy az Elveszett és megtalált számlálóhoz. Itt ki kell töltenie egy speciális űrlapot részletes információkat poggyászáról: útvonal, megjelenés, rövid tartalomjegyzék, elérhetőségei állandó lakóhelyén és ideiglenes tartózkodási helyén. Ezenkívül a poggyászkövetési szolgáltatásban nagyobb valószínűséggel lát egy ehhez hasonló poggyásztáblázatot:

Ennek a besorolásnak megfelelően kódolják az eltűnt poggyászait, és – így érti – ez a két bőrönd is ugyanúgy lesz kódolva:

Tehát nyugodtan adjon hozzá további részleteket a leíráshoz, és ne hagyja ki a tartalmi záradékot. Általános szabály, hogy amikor először kitölti a poggyászkésési jelentést, akkor több olyan tartalom megjelölését kell kérni, amelyek alapján beazonosítható a poggyász, ha nincs azonosító jel a poggyász külső oldalán, és a poggyászt ki kell nyitni (ha a táska kinyitva, erről értesítést küld). Rossz példa: póló / könyv / nedves törlőkendő, jó példa: élénkpiros bikini / Malevich reprodukciók katalógusa / összecsukható vas. A kérelem kitöltése után a poggyászkövető szolgálat munkatársa ad egy számot XXXYY11111 formátumban, ahol XXX az érkezési repülőtér kódja, YY az érkezési légitársaság kódja + 5 számjegy a kérelem sorozatszámából: például JFKLH12345, ha a Lufthansával a New York-i Kennedy repülőtérre repültél. Ne feledje vagy írja le ezt a számot – ez lesz a legegyszerűbb módja annak, hogy megtalálja jelentkezését a jövőbeni alkalmazásokban.
Ugyanazon szám használatával MAGÁNAK is ellenőrizheti a keresés állapotát (valamiért a link eltűnik: ha nem működik, keresse meg a World Tracer Online-t, és szó szerint a második link - a worldtracer.aero webhelyen a Baggage Tracing címszóval - az, amire szüksége van), mert át kell jutnia a Lost&found-hoz. gyakran nagyon nehéz
3. Próbálja meg felvenni a kapcsolatot a légitársaság irodájával az érkezési repülőtéren: időnként (hangsúlyozom - NÉHA!), ha nem repült haza, hanem ideiglenes tartózkodási helyre (nyaralás, üzleti út), a légitársaság tud garnitúrát biztosítani. piperecikkek (a Lufthansa tartalmaz egy túlméretezett pólót, fogkefét és pasztát, fésűt, kis csomag sampon és tusfürdőt, egy csomag mosóport stb.), vagy fizessen be kisebb összeget készpénzben a helyszínen. (azonnali készpénzes fizetés).

Mi lesz ezután?
A fájl (az úgynevezett AHL) a központi poggyászkereső rendszerbe (World Tracer) kerül. Minden fel nem vett poggyász ugyanabba a keresési rendszerbe kerül, függetlenül attól, hogy a csomagtartó zugában vagy a poggyászszalagon maradt-e, egy XXXYY11111 formátumú fájl is létrejött, csak más altípusú - az ún. aktuális jelentés vagy OHD. Ha az AHL és az OHD fájl adatai egybeesnek (vezetéknév, bőrönd leírása, útvonal, stb.), akkor mindkét állomás (ahol a poggyász elvesztését jelezték, és ahol a fel nem vett poggyászt megtalálták) értesítést kap, majd ez technológia kérdése: újraellenőrzés és siker esetén a poggyász továbbítása a kívánt városba. Természetesen nagy számban saját készítésű- üzenetküldés, hasonló, de nem azonos bőröndök elutasítása, plusz válaszadás többre telefonhívások- általában a poggyászkereső szolgálat munkatársai sosem unatkoznak.
Hozzávetőleges statisztika: az elveszett poggyászok több mint 90%-a a keresés első 3 napjában megtalálható, 3%-a pedig örökre elveszett.
Mit tehetsz?
1. Ha érkezéskor bármit sürgősen meg kell vásárolnia (fogkefétől az öltönyig), mindenképpen őrizze meg a nyugtákat, hogy később kártérítést kaphasson. Kerülnie kell azonban a felesleges drága vásárlásokat, később elmagyarázom, miért.
2. Új lépések után készítse el a legrészletesebb tartalomjegyzéket, lehetőleg színnel, márkával és hozzávetőleges költség minden egyes tétel, ideális esetben angol nyelven (egyébként a légitársaság alkalmazottjának le kell fordítania ezt a listát, hogy belépjen a rendszerbe), lépjen kapcsolatba a légitársasággal, és küldje el nekik ezt a listát, amely hozzáadódik a poggyászkereső alkalmazáshoz. Az első 5 napban a poggyászkeresést az érkezési repülőtér végzi, majd a felkutatás a fuvarozó légitársaság (a jelentkezési számban feltüntetett légitársaság – emlékszik a JFKLH12345-re?), majd 21 nap múlva Ön a fuvarozó légitársaság feladata lesz. végső kártérítést kérhet.
3. Ha az elveszett poggyászról szóló nyilatkozat benyújtásától számított 21 nap elteltével nem találják meg, lépjen kapcsolatba a fuvarozó légitársasággal kártérítés követelése érdekében. Ha nem tévedek, az elévülési idő 2 év, i.e. Kártérítést a kárigény benyújtásától számított két éven belül igényelhet.

Kártérítés kifizetése.
A kártérítés kifizetéséhez fel kell vennie a kapcsolatot a légitársaság képviseletével fizetési kérelemmel, a repülést és a poggyász elvesztésének tényét igazoló dokumentumokkal (beszállókártyák, poggyászcímkék, poggyászveszteség igény száma, fizetési adatok). Ha nem tévedek, az Orosz Föderációban 30 napon belül jogilag meg kell fontolni a kártérítési határozatot. Előfordulhat, hogy meg kell becsülni a tartalom költségét, és lehetőség szerint a bőrönd és a benne lévő tárgyak vásárlásáról szóló bizonylatokat kell benyújtani (megértem, hogy ez a legtöbb esetben irreális, de ez az eljárás része).
Korábban a kifizetések a feladott poggyász súlya alapján történtek – körülbelül 20 dollár kilogrammonként. Később módosult a fizetési rendszer, és a légitársaságok felelőssége 1000 hagyományos egységre korlátozódott (a hagyományos egység költségét a légitársaságon belül számolják), ami munkám idején körülbelül 1300 eurónak felelt meg. Azok. hiába hozol egy bizonylatot az ezer bolíviai gekkóbőrből készült, gyémánttal kitömött Louis Vuitton bőrönd vásárlásáról, 1300 eurónál többet nem kapsz.