Uy / Internet / Anemik muhokama mavzusi php. PHPda ko'p tarmoqli hisoblash: pthreads. Pthreads nima

Anemik muhokama mavzusi php. PHPda ko'p tarmoqli hisoblash: pthreads. Pthreads nima

Ko'rinishidan, PHP ishlab chiquvchilari parallellikdan kamdan-kam foydalanadilar. Men sinxron kodning soddaligi haqida gapirmayman, albatta, oddiyroq va aniqroq, lekin ba'zida kichik foydalanish parallellik sezilarli ishlash yaxshilanishiga olib kelishi mumkin.

Ushbu maqolada biz pthreads kengaytmasi yordamida PHP da multithreadingga qanday erishish mumkinligini ko'rib chiqamiz. Buning uchun sizga PHP 7.x ning ZTS (Zend Thread Safety) versiyasi o‘rnatilgan bo‘lishi kerak. o'rnatilgan kengaytma pthreads v3. (Yozish vaqtida PHP 7.1 da foydalanuvchilar pthreads omboridagi asosiy filialdan o'rnatishlari kerak - uchinchi tomon kengaytmasiga qarang.)

Kichik tushuntirish: pthreads v2 PHP 5.x uchun mo‘ljallangan va endi qo‘llab-quvvatlanmaydi, pthreads v3 PHP 7.x uchun mo‘ljallangan va faol ishlab chiqilmoqda.

Bunday chekinishdan keyin to'g'ridan-to'g'ri mavzuga o'taylik!

Bir martalik vazifalarni qayta ishlash

Ba'zan siz bir martalik vazifalarni ko'p bosqichli usulda qayta ishlashni xohlaysiz (masalan, ba'zi bir kiritish/chiqarish bilan bog'liq vazifalarni bajarish). Bunday hollarda siz Thread sinfidan yangi ip yaratishingiz va alohida ish zarrachasida ba'zi ishlovlarni bajarishingiz mumkin.

Masalan:

$task = yangi sinf mavzuni kengaytiradi ( xususiy $response; umumiy funktsiyani ishga tushirish() ( $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"

Bu erda ishga tushirish usuli bizning qayta ishlashimiz bo'lib, u yangi ip ichida bajariladi. Thread::start chaqirilganda yangi ip paydo bo'ladi va ishga tushirish usuli chaqiriladi. Keyin biz Thread::join ga qo'ng'iroq qilish orqali asosiy ipni yana asosiy ipga birlashtiramiz, bu esa bola ipi bajarilishini tugatmaguncha bloklanadi. Bu biz natijani chop etishga urinishdan oldin vazifa bajarilishini ta'minlaydi (u $task->response da saqlanadi).

Sinfni oqim mantig'i bilan bog'liq qo'shimcha mas'uliyat (jumladan, ishga tushirish usulini aniqlash mas'uliyati) bilan ifloslantirish istalmagan bo'lishi mumkin. Bunday sinflarni Threaded sinfidan meros qilib olish orqali farqlashimiz mumkin. Keyin ular boshqa ip ichida ishga tushirilishi mumkin:

Sinf vazifasi Threaded-ni kengaytiradi ( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->javob = $ mos keladi ) ) $task = new Task; $thread = new class($task) Thread kengaytiradi ( private $task; public function __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork() ); $thread->start() && $thread->join(); var_dump($task->javob);

Alohida ish zarrachasida ishlashi kerak bo'lgan har qanday sinf kerak Threaded sinfidan meros. Buning sababi shundaki, u turli xil oqimlarda ishlov berishni amalga oshirish uchun zarur imkoniyatlarni, shuningdek, yashirin xavfsizlik va foydali interfeyslarni (resurslarni sinxronlashtirish kabi) ta'minlaydi.

Keling, pthreads kengaytmasi tomonidan taqdim etilgan sinf ierarxiyasini ko'rib chiqaylik:

Threaded (Traversable, Collectable) Thread Worker uchuvchi hovuzni amalga oshiradi

Biz allaqachon Thread va Threaded sinflarining asoslarini qamrab oldik va o'rgandik, endi qolgan uchtasini ko'rib chiqamiz (Worker, Volatile va Pool).

Mavzularni qayta ishlatish

Parallellashtirilishi kerak bo'lgan har bir vazifa uchun yangi mavzuni boshlash juda qimmat. Buning sababi, PHP ichida ko'p ish zarralariga erishish uchun pthreadlarda umumiy-hech narsa arxitekturasini amalga oshirish kerak. Bu shuni anglatadiki, PHP tarjimonining joriy nusxasining butun ijro konteksti (shu jumladan, har bir sinf, interfeys, xususiyat va funksiya) yaratilgan har bir ip uchun nusxalanishi kerak. Bu sezilarli ishlash ta'siriga ega bo'lganligi sababli, oqim har doim imkon qadar qayta ishlatilishi kerak. Mavzularni ikki xil usulda qayta ishlatish mumkin: Workers yoki Pools yordamida.

Ishchi sinfi boshqa ish zarrachasi ichida bir qator vazifalarni sinxron ravishda bajarish uchun ishlatiladi. Bu yangi Ishchi misolini yaratish (yangi ish zarrachasini yaratuvchi) va keyin vazifalarni alohida ish stekasiga surish (Worker::stack yordamida) orqali amalga oshiriladi.

Mana kichik bir misol:

Sinf vazifasini kengaytiradi Threaded ( xususiy $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Vazifa: ($this->qiymat) \n"; ) ) $ishchi = yangi ishchi(); $worker->start(); for ($i = 0; $i stack(new Task($i)); ) while ($worker->collect()); $worker->shutdown();

Yuqoridagi misolda yangi $worker obyekti uchun 15 ta vazifa Worker::stack usuli orqali stekga suriladi va keyin ular surilgan tartibda qayta ishlanadi. Ishchi::to'plash usuli, yuqorida ko'rsatilganidek, vazifalarni bajarishni tugatgandan so'ng ularni tozalash uchun ishlatiladi. U bilan, bir muncha vaqt oralig'ida, biz stekdagi barcha vazifalar bajarilmaguncha va tozalanmaguncha asosiy ipni bloklaymiz - biz Worker::shutdown ni chaqirishdan oldin. Ishchini muddatidan oldin tugatish (ya'ni, hali bajarilishi kerak bo'lgan vazifalar mavjud bo'lganda) barcha vazifalar bajarilishini tugatmaguncha asosiy mavzuni bloklaydi, faqat vazifalar axlat yig'ilmaydi (bu xotiraning oqishini anglatadi).

Ishchi sinfi o'zining vazifalar stekiga tegishli bir qancha boshqa usullarni taqdim etadi, jumladan, oxirgi yig'ilgan vazifani o'chirish uchun Worker::unstack va bajarilish stekidagi vazifalar sonini olish uchun Worker::getStacked. Ishchilar to'plami faqat bajarilishi kerak bo'lgan vazifalarni o'z ichiga oladi. Stekdagi vazifa bajarilgandan so'ng, u olib tashlanadi va axlat yig'ish uchun alohida (ichki) stekga joylashtiriladi (Worker::collect usuli yordamida).

Bir nechta vazifalarda ipni qayta ishlatishning yana bir usuli - bu iplar hovuzidan foydalanish (Pool klassi orqali). Mavzular hovuzi vazifalarni bajarish uchun Ishchilar guruhidan foydalanadi bir vaqtning o'zida, bunda hovuz yaratilganda parallellik omili (u bilan ishlaydigan hovuz iplari soni) o'rnatiladi.

Keling, yuqoridagi misolni ishchilar pulidan foydalanishga moslashtiramiz:

Sinf vazifasini kengaytiradi Threaded ( xususiy $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Vazifa: ($this->qiymat) \n"; ) ) $hovuz = yangi Hovuz(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $pool->shutdown();

Ishchidan farqli o'laroq, hovuzdan foydalanishda bir nechta sezilarli farqlar mavjud. Birinchidan, hovuzni qo'lda ishga tushirishning hojati yo'q, ular mavjud bo'lishi bilanoq u vazifalarni bajarishni boshlaydi. Ikkinchidan, biz yuborish hovuzga vazifalar, emas ularni to'plamga qo'ying. Bundan tashqari, Pool klassi Threaded-dan meros bo'lmaydi va shuning uchun boshqa ish zarrachalariga o'tkazib bo'lmaydi (Ishchidan farqli o'laroq).

Ishchilar va hovuzlar har doim o'z vazifalarini bajarishlari bilanoq tozalashlari va keyin ularni o'zlari qo'lda tugatishlari yaxshi amaliyotdir. Thread klassi yordamida yaratilgan mavzular ham asosiy ipga biriktirilishi kerak.

pthreads va (im)mutability

Biz to'xtaladigan oxirgi sinf - bu uchuvchi, pthreads v3 ga yangi qo'shilgan. O'zgarmaslik pthreadlarda muhim tushunchaga aylandi, chunki usiz ishlash sezilarli darajada yomonlashadi. Shuning uchun, sukut bo'yicha, o'zlari Threaded ob'ektlari bo'lgan Threaded sinflarining xususiyatlari endi o'zgarmasdir va shuning uchun ularni dastlabki tayinlanganidan keyin qayta yozib bo'lmaydi. Bunday xususiyatlar uchun aniq o'zgaruvchanlik hozirda afzal ko'riladi va hali ham yangi Volatile klassi yordamida erishish mumkin.

Keling, yangi o'zgarmaslik cheklovlarini ko'rsatadigan misolni ko'rib chiqaylik:

Sinf vazifasi Threaded-ni kengaytiradi // Threaded sinf ( umumiy funktsiya __construct() ( $this->data = new Threaded(); // $this->ma'lumotlar qayta yozilmaydi, chunki u Threaded sinfining Threaded xususiyatidir ) ) $task = new class(new Task()) Thread kengaytiradi ( // a Threaded klass, chunki Thread Threaded umumiy funksiyasini kengaytiradi __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); bu xususiyat Threaded sinfining Threaded a'zosi bo'lgani uchun ) );

Boshqa tomondan, uchuvchi sinflarning tishli xususiyatlari o'zgaruvchan:

Sinf topshirig'i uchuvchanlikni kengaytiradi ( umumiy funktsiya __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // amal qiladi, chunki biz o'zgaruvchan sinfdamiz ) ) $task = new class(new Task()) mavzuni kengaytiradi ( umumiy funktsiya __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // hali ham yaroqsiz, chunki Volatile Threaded-ni kengaytiradi, shuning uchun xususiyat hali ham Threaded sinfining Threaded a'zosi $this->volatileMember = new StdClass() );

Ko'rishimiz mumkinki, Volatile klassi Threaded xususiyatlarini o'zgartirish imkoniyatini (shuningdek, ularni unset()) ta'minlash uchun o'zining asosiy Threaded klassi tomonidan o'rnatilgan o'zgarmaslikni bekor qiladi.

O'zgaruvchanlik va O'zgaruvchanlik klassi - massivlar mavzusini yoritish uchun yana bir muhokama mavzusi mavjud. Pthreadlarda massivlar Threaded sinfining xususiyatiga tayinlanganda avtomatik ravishda Volatile ob'ektlarga o'tkaziladi. Buning sababi, bir nechta PHP kontekstlari massivlarini boshqarish xavfsiz emas.

Ba'zi narsalarni yaxshiroq tushunish uchun yana bir misolni ko'rib chiqaylik:

$massiv =; $task = new class($array) kengaytiradi Mavzu ( xususiy $data; umumiy funktsiya __construct(massiv $massiv) ( $this->data = $array; ) umumiy funktsiya run() ( $this->data = 4; $ this->ma'lumotlar = 5 print_r($this->ma'lumotlar) ); $task->start() && $task->join(); /* Chiqish: oʻzgaruvchan obyekt ( => 1 => 2 => 3 => 4 => 5) */

Biz uchuvchan ob'ektlarni massivlar kabi ko'rib chiqish mumkinligini ko'ramiz, chunki ular (yuqorida ko'rsatilganidek) subset() operatori kabi massiv operatsiyalarini qo'llab-quvvatlaydi. Biroq, o'zgaruvchan sinflar array_pop va array_shift kabi asosiy massiv funksiyalarini qo'llab-quvvatlamaydi. Buning o'rniga, Threaded klassi bizga o'rnatilgan usullar kabi operatsiyalarni taqdim etadi.

Namoyish sifatida:

$ma'lumotlar = yangi sinf O'zgaruvchan (ommaviy $a = 1; umumiy $b = 2; ommaviy $c = 3; ); var_dump($ma'lumotlar); var_dump($data->pop()); var_dump($data->shift()); var_dump($ma'lumotlar); /* Chiqish: obyekt(sinf@anonim)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) obyekti(sinf@anonim)#1 (1) (["b"]=> int(2) ) */

Boshqa qo'llab-quvvatlanadigan operatsiyalarga Threaded::chunk va Threaded::merge kiradi.

Sinxronizatsiya

Ushbu maqolaning oxirgi qismida biz pthreadlardagi sinxronizatsiyani ko'rib chiqamiz. Sinxronizatsiya - bu umumiy resurslarga kirishni boshqarish imkonini beruvchi usul.

Masalan, oddiy hisoblagichni amalga oshiramiz:

$counter = yangi sinfni kengaytiradi Thread ( public $i = 0; public function run() (for ($i = 0; $i i; ) ) ); $counter->start(); uchun ($i = 0; $i i; ) $counter->join(); var_dump($counter->i); // 10 dan 20 gacha raqamni chop etadi

Sinxronizatsiyadan foydalanmasdan, chiqish deterministik emas. Bir nechta iplar bir xil o'zgaruvchiga boshqariladigan ruxsatsiz yozadi, bu yangilanishlar yo'qolishini anglatadi.

Keling, vaqtni qo'shish orqali 20 ning to'g'ri chiqishini olishimiz uchun buni tuzatamiz:

$counter = new class extensions Thread ( public $i = 0; public function run() ( $this->synchronized(function () (for ($i = 0; $i i; ) ); ) ); $counter->start(); $counter->synchronized(funktsiya ($counter) (uchun ($i = 0; $i i; ) ), $counter); $counter->join(); var_dump($counter->i); // int (20)

Sinxronlashtirilgan kod bloklari Threaded::wait va Threaded::notify (yoki Threaded::notifyAll) usullari yordamida ham bir-biri bilan bog'lanishi mumkin.

Mana ikkita sinxronlashtirilgan while tsiklidagi muqobil o'sish:

$counter = yangi sinfni kengaytiradi Thread ( public $cond = 1; public function run() ( $this->synchronized(function () (for ($i = 0; $i notify(); if ($this->cond) === 1) ( $this->cond = 2; $this->wait(); ) ) )); $counter->start(); $counter->synchronized(funksiya ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // birinchi navbatda ikkinchisi boshlanishini kuting ) uchun ($i = 10; $i notify(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->join(); /* Chiqish: 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) */

Threaded::wait ga qo'ng'iroq qilish atrofida qo'shimcha shartlar mavjudligini ko'rishingiz mumkin. Ushbu shartlar juda muhim, chunki ular bildirishnoma olganida va belgilangan shart rost bo'lganda sinxronlashtirilgan qayta qo'ng'iroqni davom ettirishga imkon beradi. Bu muhim, chunki bildirishnomalar Threaded::notify chaqirilgandan boshqa joylardan kelishi mumkin. Shunday qilib, agar Threaded::wait usuliga qo'ng'iroqlar shartlarga kiritilmagan bo'lsa, biz bajaramiz. noto'g'ri qo'ng'iroqlar, bu oldindan aytib bo'lmaydigan kod xatti-harakatlariga olib keladi.

Xulosa

Biz pthreads to'plamining beshta sinfini (Threaded, Thread, Worker, Volatile va Pool) va har bir sinfdan qanday foydalanishni ko'rib chiqdik. Shuningdek, biz yaratilgan pthreadlarda o'zgarmaslikning yangi kontseptsiyasini ko'rib chiqdik qisqacha ma'lumot qo'llab-quvvatlanadigan sinxronizatsiya imkoniyatlari. Ushbu asoslar mavjud bo'lsa, biz endi haqiqiy dunyo holatlarida pthreadlardan qanday foydalanish mumkinligini ko'rib chiqishni boshlashimiz mumkin! Bu bizning keyingi postimizning mavzusi bo'ladi.

Agar siz keyingi postning tarjimasi bilan qiziqsangiz, menga xabar bering: ijtimoiy tarmoqlarda sharh qoldiring. tarmoqlar, ovoz bering va postni hamkasblar va do'stlar bilan baham ko'ring.

Tarmoqli muhokama

A mavzuli muhokama elektron munozara (masalan, elektron pochta orqali, elektron pochta ro'yxati, e'lonlar taxtasi, yangiliklar guruhi yoki Internet forumi) bo'lib, unda dasturiy ta'minot foydalanuvchiga xabarlarni vizual guruhlash orqali yordam beradi. Xabarlar odatda mavzu bo'yicha ierarxiyada vizual tarzda guruhlanadi. Shu tarzda guruhlangan xabarlar to'plami a deyiladi mavzu mavzusi yoki oddiygina "ip". Muhokama forumi, elektron pochta mijozi yoki yangiliklar mijozi, agar u shu tarzda oson o'qish uchun bir xil mavzudagi xabarlarni bir joyga to'plasa, "torli mavzular"ga ega deb ataladi. Bundan tashqari, mavzuli muhokamalar odatda foydalanuvchilarga mavzu doirasidagi ma'lum bir postga javob berish imkonini beradi. Natijada, mavzu doirasidagi muhokamalar ierarxiyasi bo'lishi mumkin. Har xil turdagi dasturiy ta'minot bu ierarxiyani qaysi mavzuda ko'rsatishga imkon berishi mumkin. Tishli rejim deb ataladi. (Muqobil chiziqli rejim bo'lib, u odatda kimga aniq javob bergan bo'lishidan qat'i nazar, barcha xabarlarni sana tartibida ko'rsatadi.)

Afzalliklar

Ierarxik ko'rinishlarning afzalligi shundaki, ular o'quvchiga suhbatning umumiy tuzilishini, xususan, kim kimga javob berayotganini tezda tushunishga imkon beradi. Shunday qilib, u kengaytirilgan suhbatlar yoki munozaralar, masalan, yangiliklar guruhlari uchun foydalidir: haqiqatan ham, haqiqatan ham murakkab munozaralar uchun, qandaydir ierarxik tarmoq tizimisiz argumentga amal qilish tezda imkonsiz bo'lib qoladi.

Yana bir afzallik - bu ierarxik tizimlarda hamjamiyatni yanada nozik baholashdir. Muayyan xabarlarga javoblar berilishi kerakligi sababli, ular aniq shaxslarga ham beriladi. Shunday qilib, mavzuli suhbatlar yozuvchini javob berilgan shaxsning o'ziga xos qarashlari va shaxsiyatiga qaratadi. Bu so'nggi sharh umumiy hovuzga kiritilgan forumlarda kamroq uchraydi.

Kamchiliklari

Yassi ipga nisbatan ierarxik ipning kamchiliklari murakkablikning ortishi hisoblanadi va shuning uchun bunday ko'rinish foydalanuvchilardan yuqori darajadagi qulaylik va murakkablikni talab qiladi. Shuning uchun uni qabul qilish Usenet, CIX yoki Slashdot kabi eng qadimgi va/yoki eng murakkab onlayn hamjamiyatlarda eng og'ir bo'lganligi ajablanarli emas. Taqqoslash uchun, veb-chat va sharh tizimlari yoshroq va kengroq auditoriya uchun ochiqdir, shuning uchun ierarxik tarmoqlilik yaqinda bunday arenalarda odatiy holga aylanib bormoqda.

Daraxt ierarxiyasini o'rnatish, shuningdek, mavzu doirasidagi muhokamani parchalashga olib keladi: endi bir nechta oldingi postlarga javob beruvchi yoki xulosalovchi xabarni joylashtirish mumkin bo'lmaydi. Buning o'rniga, har bir oldingi postga alohida javob berilishi kerak. Bu ierarxik yo'nalishdan foydalanadigan forumlarda ko'proq qarama-qarshiliklarga olib keladigan bahs-munozaralarga olib keladi. Biroq, to'g'ri bo'lsa-da, agar kerakli postga berilgan javoblar miqdori tufayli to'g'ridan-to'g'ri javob berishning iloji bo'lmasa, foydalanuvchilar suhbatni davom ettirish va davom ettirish uchun ko'pincha javob berayotgan odamning qo'shtirnoqlaridan foydalanadilar. silliq Bu ko'pchilik xabarlar kengashi hamjamiyatlari tomonidan, agar o'tkazma o'zining boshqa keng qamrovli chegarasiga yetgan bo'lsa, tavsiya etiladi.

Ochiq mavzu

Ochiq mavzu o'quvchilar o'zlari tanlagan mavzuni sharhlashlari va muhokama qilishlari mumkin bo'lgan blog postiga ishora qiladi. Ular odatda ko'p miqdorda mashhur bloglarda foydaliroq tirbandlik; ular ko'pincha blog muallifi yozish uchun mavzu bo'lmaganda yoki nashr etishda sust bo'lganda ishlatiladi.

Ochiq mavzular, shuningdek, bloglarning asosiy sahifalaridagi postlarning monotonligini buzish uchun ham qo'llaniladi. Kontentga yo'naltirilgan postlarda sharhlar to'planishi mumkin; shuning uchun mualliflar sahifa yuklash vaqtlari sekinlashmasligi uchun ochiq mavzulardan foydalanadilar.

Misollar

*Yahoo! Guruhlar [ http://groups.yahoo.com/], MSN guruhlari [ http://groups.msn.com/] va Slashdot [ http://www.slashdot.com/] barchasi mavzuli munozaralarni o'z ichiga olgan veb-asoslangan forumlarni taklif qiladi.

Shuningdek qarang

* Ilmiy Skywriting
* Blog yuritish shartlari ro'yxati

Ma'lumotnomalar

* Dartmut. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Onlayn muhokama qilish" ]
*Wolsey, T. DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Kibermakonda adabiyot muhokamasi: Yosh o'smirlar kitoblar haqida suhbatlashish uchun mavzuli munozara guruhlaridan foydalanadilar.]. "Onlayn o'qish", 7(4), 2004 yil yanvar/fevral. Olingan: 2007 yil 30 dekabr

Wikimedia fondi.

  • 2010 yil.
  • Leon Pau

Barh Azoum

    Boshqa lug'atlarga qarang: Internet-forum

    - phpBB Internet Forum dasturiy ta'minot to'plami, eng mashhur forum paketlaridan biri... Vikipediya Virtual o'quv muhitlari tarixi 1990-yillar

    - Virtual oʻquv muhitlari tarixida 1990-yillar, birinchi navbatda, arzon kompyuter va Internetning paydo boʻlishi bilan bogʻliq oʻsish davri boʻldi. 1990-yillar1990* Formal Systems Inc. Prinston, NJ, AQSH DOS asosidagi Baholashni joriy qiladi… … Vikipediya- Birgalikda yuzma-yuz ta'lim muhitini ishlab chiquvchi(lar)i LEAD konsortsiumi Barqaror nashr 5.0 / iyun 2010 Operatsion tizim O'zaro platforma … Vikipediya

    Suhbatni o'tkazish- bu ko'plab elektron pochta mijozlari, e'lonlar taxtasi, yangiliklar guruhlari yoki Internet forumlari tomonidan qo'llaniladigan xususiyat bo'lib, unda dasturiy ta'minot foydalanuvchiga xabarlarni vizual guruhlash orqali yordam beradi. Xabarlar odatda mavzu bo'yicha ierarxiyada vizual tarzda guruhlanadi. Guruhlangan xabarlar to'plami... ... Vikipediya

    Slashdot- Slashdot.org bosh sahifasining skrinshoti URL slashdot.org ahmoqlar uchun shior yangiliklari. Muhim narsalar... Vikipediya

    MediaWiki- nomlar maydoni bu erda yo'naltiriladi. Vikipediyadagi MediaWiki nom maydoni boʻyicha yordam olish uchun Yordam:MediaWiki nom maydoniga qarang. Vikipediya nom maydonlari haqida umumiy maʼlumot uchun Vikipediya:Ismlar maydoniga qarang. Muhokama sahifasi va MediaWiki munozara sahifasi shu yerda yoʻnaltiriladi. ... ... Vikipediya uchun

    Kompyuter orqali aloqa- Boshqa foydalanish uchun qarang: CMC (aniqlash). Kompyuter vositachiligidagi aloqa (CMC) ikki yoki undan ortiq tarmoqqa ulangan kompyuterlardan foydalanish orqali sodir bo'ladigan har qanday kommunikativ tranzaksiya sifatida aniqlanadi. Bu atama an'anaviy ravishda o'shalarni nazarda tutgan bo'lsa-da… … Vikipediya

    Wiki dasturiy ta'minotini taqqoslash- Quyidagi jadvallarda bir qator wiki dasturiy paketlari uchun umumiy va texnik ma'lumotlar solishtiriladi. Mundarija 1 Umumiy ma’lumot 2 Maqsadli auditoriya 3 Xususiyatlar 1 4 Xususiyatlar 2 … Vikipediya

    Ilmiy Skywriting- kognitiv olim Stiven Xarnad tomonidan kiritilgan atama boʻlib, bir nechta elektron pochta va mavzuga oid veb-arxiv, masalan, yangiliklar guruhi, elektron pochta roʻyxati, gipermail, netnews yoki Internet-forum, bogʻlangan va sana boʻyicha saralangan,…… Vikipediya.

    Birgalikda qaror qabul qilish uchun dasturiy ta'minot- Birgalikda qaror qabul qilish (CDM) dasturiy ta'minoti o'z vaqtida jamoaviy qarorlar qabul qilish uchun zarur bo'lgan funksiya va xususiyatlarni muvofiqlashtiruvchi dasturiy ta'minot yoki modul bo'lib, barcha tegishli manfaatdor tomonlarning jarayonda ishtirok etishiga imkon beradi. Bu... ... Vikipediya

Men yaqinda pthreadlarni sinab ko'rdim va juda hayratda qoldim - bu PHPda bir nechta haqiqiy mavzular bilan ishlash qobiliyatini qo'shadigan kengaytma. Na taqlid, na sehr, na soxta - hamma narsa haqiqiy.



Men bunday vazifani o'ylayapman. Tezda bajarilishi kerak bo'lgan vazifalar to'plami mavjud. PHP da bu muammoni hal qilish uchun boshqa vositalar mavjud, ular bu yerda tilga olinmagan, maqola pthreadlar haqida.



Pthreads nima

Bo'ldi shu! Xo'sh, deyarli hamma narsa. Darhaqiqat, qiziquvchan o'quvchini xafa qiladigan narsa bor. Bularning hech biri standart variantlar bilan tuzilgan standart PHP da ishlamaydi. Ko'p ish zarralaridan bahramand bo'lish uchun PHP-da ZTS (Zend Thread Safety) yoqilgan bo'lishi kerak.

PHP o'rnatish

Keyingi, ZTS bilan PHP. ZTSsiz PHP (37,65 ga qarshi 265,05 soniya) bilan solishtirganda bajarilish vaqtining bunday katta farqiga e'tibor bermang, men PHP sozlamalarini umumlashtirishga urinmadim. ZTS bo'lmagan holatda, masalan, menda XDebug yoqilgan.


Ko'rib turganingizdek, 2 ta ipdan foydalanganda dasturni bajarish tezligi chiziqli kodga qaraganda taxminan 1,5 baravar yuqori. 4 ta ipdan foydalanganda - 3 marta.


Shuni ta'kidlash mumkinki, protsessor 8 yadroli bo'lsa ham, agar 4 dan ortiq ip ishlatilgan bo'lsa, dasturning ishlash vaqti deyarli o'zgarmagan. Bu mening protsessorimda 4 ta jismoniy yadroga ega bo'lganligi sababli, men lavhani diagramma shaklida tasvirlab berdim.


Rezyume; qayta boshlash

PHP da pthreads kengaytmasi yordamida ko'p ish zarralari bilan juda oqlangan ishlash mumkin. Bu hosildorlikning sezilarli o'sishini ta'minlaydi.

Teglar: teglar qo'shish

Mening yaxshi do'stimning onasi Sankt-Peterburgdan Moskvaga uchayotganda chamadonini yo'qotib qo'ydi va u yana issiqroq qirg'oqlarga parvoz qildi va u allaqachon kurortda edi - mayo, sandal va faqat T. - qo'l yukidan ko'ylak. Qadimgi vaqtlar uchun men unga nima qilish va qaerga yugurish haqida bir nechta maslahatlar berdim va bugun men ma'lum bir mavzu bo'yicha bilgan hamma narsani shu erda yozishga qaror qildim.

Qaerda juda aqlli ekanligimni tushuntirish uchun, eslatib o'tamanki, men bir vaqtning o'zida bir nechta aviakompaniyalarning yer xizmatlarida ishlaganman, jumladan, bagaj qidirish bilan bog'liq ba'zi masalalar bilan shug'ullanganman. Albatta, o'zimning parvoz tajribam. Biroq, chunki Men aviatsiya xizmati sohasini bir necha yil oldin tark etganman, ehtimol ba'zi nuanslar o'zgargan bo'lishi mumkin - agar shunday bo'lsa, men mavzu bo'yicha sharhlarni minnatdorchilik bilan qabul qilaman va postdagi ma'lumotlarni tuzataman.

Men bundan boshlayman Yukingizni yo'qotmaslik uchun nima qilish kerak:
1. Chamadoningizdan oldingi sayohatlardagi barcha teglar va stikerlarni, hatto shtrixli kichiklarini ham yirtib tashlang, ular ko'pincha chamadonning o'ziga alohida yopishtiriladi - ular yukni avtomatik skanerlash va saralash tizimini chalkashtirib yuborishi mumkin.
2. Chamadoningizga ism yorlig'ini osib qo'ying (sumka, quti, paket - umuman olganda, siz bagaj sifatida ro'yxatdan o'tishingiz mumkin bo'lgan hamma narsa): oldindan qayta foydalanish mumkin bo'lgan variantni sotib olishingiz yoki ro'yxatdan o'tish peshtaxtasida qog'oz yorlig'ini olishingiz mumkin - odatda hammasi yarim munosib aviakompaniyalar ularni cheklovsiz berishadi. Va, masalan, Amirliklarda, odatda, juda uzoq vaqt xizmat qiladigan bardoshli shnurda mukammal plastik teglar mavjud:

Qadimgi paranoidlar men kabi qila oladilar: menda doimo uy manzilim, telefon raqamim va jomadonimga osilgan Samsonite to'plamidan qayta foydalanish mumkin bo'lgan plastik yorliq bor. elektron pochta orqali, va men ta'tilda biron joyga uchganimda, men qo'shimcha ravishda yangi joyda qolish sanalari va barcha mumkin bo'lgan aloqalarni (mehmonxonaning nomi va manzili, mahalliy telefon raqami, agar mavjud bo'lsa) ko'rsatadigan qog'oz yozuvni osib qo'yaman. va mening ismim va familiyam, albatta).
3. Roʻyxatdan oʻtish peshtaxtasida yukingizga roʻyxatdan oʻtish agenti chop etadigan bagaj yorligʻi – siz uchayotgan shahar kodi va parvoz raqami koʻrsatilgan holda yopishtirilganligiga ishonch hosil qiling.
4. Agar sizda bir nechta bog'langan reyslar bo'lsa, bu haqda ro'yxatdan o'tish agentiga xabar bering va yukingizni qaysi nuqtaga tekshirmoqchi ekanligingizni belgilang. Ba'zi hollarda, sizning xohishingizdan qat'i nazar, yukni marshrut bo'ylab u yoki bu aeroportda olish kerak bo'ladi: bu, masalan, aeroportlar o'rtasidagi transferlarga tegishli (Parijdagi Orli va Sharl de Goll, Domodedovo - Sheremetyevo - "Vnukovo" " Moskvada), alohida terminallar (Frankfurtdagi 1 va 2-terminallar) yoki AQSh yoki Meksikaga kelgan birinchi nuqtada - bu ushbu mamlakatlarda bojxona talabi: siz Moskva-Vashington-Feniks yo'nalishi bo'yicha parvoz qilyapsiz deylik, bagaj yorlig'i Feniksning barcha uch segmenti uchun beriladi, ammo Vashingtonda yukni jismonan olish, bojxonadan o'tkazish va yana ro'yxatdan o'tkazish kerak bo'ladi, shuningdek, agar siz bortga chiqishdan oldin olishingiz mumkin bo'lgan bolalar aravachasini tekshirayotgan bo'lsangiz samolyot yoki hayvon bo'lsa, siz uni tranzit joyidan olishingiz kerak bo'ladi. Umuman olganda, transferlar bilan murakkab marshrut bo'lsa, bagaj harakati tafsilotlarini aviakompaniyaning aloqa markazida yoki o'ta og'ir hollarda ro'yxatdan o'tish paytida oldindan aniqlab olish yaxshiroqdir.
5. Yukingizni ko'rinadigan qilib qo'ying: bagajning kechikishi har doim ham bagaj xodimlarining aybi yoki saralash tizimidagi nosozliklar emas. Ba'zida uzoq parvozdan keyin charchagan yana bir bema'ni yo'lovchi bagaj kamaridan xuddi sizniki kabi qora Samsonit yoki oddiy sport sumkasini oladi. Shuning uchun, yukingizni belgilang: tutqichga bir nechta yorqin lentalarni yoki kichik yumshoq o'yinchoqni osib qo'ying, ustiga katta stiker yopishtiring yoki chamadonni tanlashda oddiygina g'ayrioddiy rangga ustunlik bering.

Bagajda nimani tekshirmaslik kerak?
Esingizda bo'lsin, barcha aviakompaniyalar va aeroportlar bagajni yo'qotadi. Albatta, statistika har bir kishi uchun har xil, lekin hatto eng ishonchli aviakompaniyalar ham yukni yo'qotishi yoki kechiktirishi mumkin, hatto eng kichik aeroportda ham, bitta bagaj boshqaruvchisi chamadonli aravani to'g'ridan-to'g'ri ro'yxatdan o'tish peshtaxtasidan samolyotga olib boradi. Shuning uchun men har doim qo'l yukingizni olishingizni maslahat beraman:
- muhim hujjatlar, shu jumladan parvoz paytida kerak bo'lmagan hujjatlar (masalan, Sankt-Peterburgga oxirgi safarim paytida men litsenziyani o'zgartirishim kerak edi va men o'zim bilan qo'l yukimga nikoh guvohnomasi va barcha turdagi kartalarni oldim. haydovchi maktabi)
- kalitlar (manzilingiz ko'rsatilgan teg bilan birgalikda bu xavfli bo'lishi mumkin)
- pul, zargarlik buyumlari (sharhlarsiz)
- qimmat mo'rt uskunalar
- muntazam ravishda qabul qiladigan, parvoz uchun zarur bo'lgan miqdorda va xorijiy davlat yoki shaharda analogni izlashga to'g'ri kelsa, kichik zahiraga ega bo'lgan dori-darmonlar. Agar yukingiz yo'qolsa, sotib olinmaydigan retsept bo'yicha dori-darmonlarni butun sayohat uchun zarur bo'lgan miqdorda o'zingiz bilan olib boring.
- yetib kelganda zudlik bilan kerak bo'lishi mumkin bo'lgan narsa (masalan, zaryadlovchi telefon uchun
- shaxsan siz uchun sentimental ahamiyatga ega bo'lgan narsa: ba'zida yuk abadiy yo'qoladi va agar shaxsiy kundalikingizni yo'qotib qo'ysangiz, uni uyda qoldirganingiz yoki samolyotda o'zingiz bilan olib ketganingiz ma'qul.

Bir ibratli voqea: Sankt-Peterburgdagi Lufthansa’da ishlagan paytimda AQShdan bir er-xotin qo‘llarini burishtirib ishxonamizga yugurib kelishdi – asrab olish bo‘yicha sud jarayoni uchun juda muhim hujjatlar bo‘lgan ularning yuklari yetib kelmagan edi, sud ertasi kuni edi. Albatta, yukning yo'qolishida aviakompaniya aybdor, ammo bundan kimga naf? Bunday vaziyatga duch kelmaslik uchun qo'l yukingizga muhim qog'ozlarni qo'yish kifoya edi.

Shunday qilib, siz yetib keldingiz va yukingizni bagaj kamarida topa olmadingiz. Nima qilsa bo'ladi?
1. Agar siz bagajingizda oddiy chamadonlardan farq qiladigan narsalarni tekshirgan bo'lsangiz: chang'i, violonchel, devor o'lchamli plazma paneli, bolalar aravachasi, jonli marmar dana, deb nomlangan narsalarni berish uchun alohida punkt mavjudligini tekshiring. katta o'lchamli yuk yoki katta hajmli yuk - yuqorida tavsiflanganga o'xshash yuk ko'pincha alohida bo'limga solinadi va alohida, qo'lda tushiriladi. Agar sizning yukingiz u erda ham topilmasa
2. Bagajni kuzatish yoki Yoʻqotilganlar va topilganlar hisoblagichiga oʻting. U erda siz maxsus shaklni to'ldirishingiz kerak bo'ladi batafsil ma'lumot yukingiz haqida: marshrut, ko'rinish, kontentning qisqacha ro'yxati, doimiy yashash joyingiz va vaqtincha bo'lgan joyingizdagi kontaktlaringiz. Bundan tashqari, bagajni qidirish xizmatida siz shunday bagaj jadvalini ko'rishingiz mumkin:

Aynan shu tasnifga ko'ra, sizning yo'qolgan yukingiz kodlanadi va siz tushunganingizdek, bu ikki chamadon bir xil kodlanadi:

Shuning uchun tavsifga qo'shimcha ma'lumotlarni qo'shing va kontent bandini o'tkazib yubormang. Qoidaga ko'ra, birinchi marta bagaj kechikish dalolatnomasini to'ldirganingizda, sizdan bir nechta tarkibni ko'rsatishingiz so'raladi, ular orqali sumkangizni aniqlash mumkin bo'lsa, agar tashqarida identifikatsiya belgilari bo'lmasa va sumka ochilishi kerak bo'lsa (agar bo'lsa). sumka ochilgan bo'lsa, siz bu haqda bildirishnoma yuborasiz). Yomon misol: futbolka / kitob / nam salfetkalar, yaxshi misol: yorqin qizil bikini / Malevich reproduktsiyalari katalogi / yig'ma temir. Arizani to'ldirgandan so'ng, bagajni qidirish xizmati xodimi sizga XXXYY11111 formatidagi raqamni beradi, bu erda XXX - kelish aeroporti kodi, YY - kelish aviakompaniyasi kodi + arizaning seriya raqamining 5 raqami: masalan, JFKLH12345, agar siz Lufthansa bilan Nyu-Yorkdagi Kennedi aeroportiga uchgansiz. Ushbu raqamni eslab qoling yoki yozib oling - bu kelajakdagi ilovalarda arizangizni topishning eng oson yo'li bo'ladi.
Xuddi shu raqamdan foydalanib, qidiruv holatini O'zingiz tekshirishingiz mumkin (ba'zi sabablarga ko'ra havola yo'qoladi: agar u siz uchun ishlamasa, Google World Tracer Online va tom ma'noda ikkinchi havola - worldtracer.aero veb-saytidagi Baggage Tracing sarlavhasi bilan - sizga kerak bo'lgan narsa), chunki yo'qolgan va topilgan manzilga o'tish. ko'pincha juda qiyin
3. Aviakompaniyangizning yetib kelish aeroportidagi ofisiga murojaat qilib ko‘ring: ba’zan (ta’kidlayman – BA’ZA!), agar siz uyga uchmagan bo‘lsangiz, lekin vaqtincha bo‘ladigan joyga (ta’til, xizmat safari), aviakompaniya komplektni taqdim qilishi mumkin. hojatxona buyumlari (Lufthansa katta o'lchamdagi futbolka, tish cho'tkasi va pasta, taroq, shampun va dush jelining kichik paketlari, bir paket kir yuvish kukuni va boshqalarni o'z ichiga oladi) yoki kichik xarajatlar uchun joyida kichik naqd to'lovni amalga oshiring. (spot naqd to'lov).

Keyin nima bo'ladi?
Sizning faylingiz (AHL deb ataladigan) markazlashtirilgan bagaj qidirish tizimiga (World Tracer) o'tadi. Barcha talab qilinmagan yuklar bir xil qidiruv tizimiga tushadi, ular bagaj hovlisining burchaklarida yorliqsiz topilganmi yoki ushbu buyumlarning har biri uchun bagaj kamarida qolganmi, XXXYY11111 formatidagi fayl; ham yaratilgan, faqat boshqa kichik turdagi - deb ataladigan. qo'lda hisobot yoki OHD. Agar AHL va OHD fayllaridagi ma'lumotlar bir-biriga to'g'ri kelsa (familiya, chamadon tavsifi, marshrut va boshqalar), ikkala stantsiya (bagajning yo'qolishi haqida xabar berilgan va talab qilinmagan bagaj topilgan) xabarnoma oladi va keyin Bu texnologiya masalasi: qayta tekshirish va muvaffaqiyatli bo'lgan taqdirda yukni kerakli shaharga jo'natish. Albatta, juda ko'p o'zi erishgan- xabar almashish, o'xshash, lekin bir xil bo'lmagan chamadonlarni rad etish, shuningdek, bir nechta javoblar telefon qo'ng'iroqlari- Umuman olganda, bagaj qidirish xizmati xodimlari hech qachon zerikmaydi.
Taxminiy statistika: yo'qolgan yuklarning 90% dan ortig'i qidiruvning dastlabki 3 kunida topiladi, 3% esa abadiy yo'qoladi.
Nima qila olasiz?
1. Agar yetib kelganingizda zudlik bilan zarur bo'lgan narsalarni (tish cho'tkasidan tortib biznes kostyumigacha) sotib olishingiz kerak bo'lsa, keyinchalik tovon puli uchun kvitansiyalaringizni saqlab qo'ying. Biroq, keraksiz qimmat xaridlardan qochishingiz kerak, sababini keyinroq tushuntiraman.
2. Yangi qadamlardan so'ng tarkibning eng batafsil ro'yxatini tuzing, afzalroq rang, brend va taxminiy xarajat Har bir element, ideal tarzda ingliz tilida (aks holda, aviakompaniya xodimi tizimga kirish uchun ushbu ro'yxatni tarjima qilishi kerak), aviakompaniya bilan bog'laning va ularga ushbu ro'yxatni yuboring, u bagaj qidirish ilovasiga qo'shiladi. Dastlabki 5 kun ichida bagajni qidirish uchib kelgan aeroport tomonidan amalga oshiriladi, keyin qidiruv tashuvchi aviakompaniya zimmasiga tushadi (ariza raqamida ko'rsatilgan aviakompaniya - JFKLH12345 esingizdami?), va 21 kundan keyin siz yakuniy kompensatsiya olish uchun ariza berishi mumkin.
3. Agar yo'qolgan bagaj to'g'risida ariza berilgan kundan boshlab 21 kun o'tgach, u topilmasa, kompensatsiyani talab qilish uchun tashuvchi aviakompaniyaga murojaat qiling. Agar xato qilmasam, da'vo muddati 2 yil, ya'ni. Siz zararni qoplash to'g'risida da'vo arizasi berilgan kundan boshlab ikki yil ichida kompensatsiya olish uchun ariza berishingiz mumkin.

Kompensatsiya to'lash.
Kompensatsiyani to'lash uchun siz aviakompaniyangizning vakolatxonasiga to'lov uchun ariza, parvozni va bagajning yo'qolganligini tasdiqlovchi hujjatlar (bortga chiqish talonlari, bagaj teglari, bagajni yo'qotish uchun da'vo raqami, to'lov rekvizitlari) bilan bog'lanishingiz kerak. Agar adashmasam, Rossiya Federatsiyasida tovon to'lash to'g'risidagi qaror 30 kun ichida qonuniy ravishda ko'rib chiqilishi kerak. Bundan tashqari, sizdan tarkibning narxini taxmin qilish va iloji bo'lsa, chamadon va undagi narsalarni sotib olish uchun kvitansiyalarni taqdim etishni so'rashi mumkin (ko'p hollarda bu haqiqatga to'g'ri kelmasligini tushunaman, lekin bu protseduraning bir qismidir).
Ilgari to‘lovlar tekshirilgan bagajning og‘irligiga qarab amalga oshirilardi – har bir kilogramm uchun taxminan 20 dollar. Keyinchalik, to'lov tizimi o'zgartirildi va aviakompaniyalarning javobgarligi 1000 an'anaviy birlik bilan cheklandi (an'anaviy birlik narxi aviakompaniya ichida hisoblanadi), bu mening ishim paytida taxminan 1300 evroga to'g'ri keldi. Bular. ming dona Boliviya gekkon terisidan yasalgan va olmos bilan to‘ldirilgan Louis Vuitton chamadonini sotib olish uchun kvitansiya olib kelsangiz ham 1300 yevrodan ko‘p pul olmaysiz.