Үй / Интернет / Анемиялық талқылау ағыны php. РНР тілінде көп ағынды есептеулер: pthreads. Жіптер дегеніміз не

Анемиялық талқылау ағыны php. РНР тілінде көп ағынды есептеулер: pthreads. Жіптер дегеніміз не

РНР әзірлеушілері конкуррентті сирек пайдаланатын сияқты. Мен синхронды кодтың қарапайымдылығы туралы айтпаймын, әрине, қарапайым және түсінікті, бірақ кейде шағын пайдаланупараллелизм өнімділікті айтарлықтай жақсартуға әкелуі мүмкін.

Бұл мақалада біз pthreads кеңейтімін пайдаланып PHP-де көп ағынды қалай алуға болатынын қарастырамыз. Ол үшін сізге орнатылған PHP 7.x нұсқасының ZTS (Zend Thread Safety) нұсқасы қажет. орнатылған кеңейтім pthreads v3. (Жазу кезінде PHP 7.1-де пайдаланушылар pthreads репозиторийіндегі негізгі тармақтан орнатуы керек - үшінші тарап кеңейтімін қараңыз.)

Кішігірім түсініктеме: pthreads v2 PHP 5.x үшін арналған және енді ол қолдау көрсетілмейді, pthreads v3 PHP 7.x үшін және белсенді түрде әзірленуде.

Осындай шегіністерден кейін сөзге тікелей көшейік!

Бір реттік тапсырмаларды өңдеу

Кейде бір реттік тапсырмаларды көп ағынды жолмен өңдегіңіз келеді (мысалы, кейбір енгізу/шығарумен байланысты тапсырманы орындау). Мұндай жағдайларда жаңа ағын жасау үшін Thread сыныбын пайдалануға және бөлек ағында кейбір өңдеуді орындауға болады.

Мысалы:

$тапсырма = жаңа сынып Тақырыпты кеңейтеді (жеке $жауап; жалпы функцияны іске қосу() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $матчтар); $this->жауап = $матчтар; ) ); $task->start() && $task->join(); var_dump($task->response); // жол (6) "Google"

Мұнда іске қосу әдісі жаңа ағынның ішінде орындалатын біздің өңдеуіміз болып табылады. Thread::start шақырылғанда, жаңа ағын пайда болады және іске қосу әдісі шақырылады. Содан кейін біз еншілес ағынды Thread::join шақыру арқылы негізгі ағынға қайта қосамыз, ол еншілес ағынның орындалуын аяқтағанша блоктайды. Бұл нәтижені басып шығару әрекетінен бұрын тапсырманың орындалуын аяқтайтынына кепілдік береді (ол $task->response ішінде сақталады).

Сыныпты ағын логикасына байланысты қосымша жауапкершіліктермен (соның ішінде іске қосу әдісін анықтау жауапкершілігімен) ластау қажет болмауы мүмкін. Біз мұндай класстарды Threaded класынан мұраға алу арқылы ажырата аламыз. Содан кейін оларды басқа ағынның ішінде іске қосуға болады:

Сынып тапсырмасы Threaded ( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $матчтар); $ this->жауап = $сәйкес келеді ) ) $тапсырма = жаңа тапсырма; $thread = new class($task) Thread кеңейтеді ( private $task; public function __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork() ); $thread->start() && $thread->join(); var_dump($тапсырма->жауап);

Бөлек ағында іске қосылуы қажет кез келген сынып міндетті Threaded сыныбынан мұра алады. Себебі ол әртүрлі ағындарда өңдеуді орындау үшін қажетті мүмкіндіктерді, сонымен қатар жасырын қауіпсіздік пен пайдалы интерфейстерді (ресурстарды синхрондау сияқты) қамтамасыз етеді.

pthreads кеңейтімі ұсынатын класс иерархиясын қарастырайық:

Бұрандалы (өткізілетін, жиналатын) жіп жұмысшысының ұшпа пулы

Біз Thread және Threaded сыныптарының негіздерін қарастырып, үйрендік, енді қалған үшеуін (Жұмысшы, Ұшқыш және Пул) қарастырайық.

Жіптерді қайта пайдалану

Параллельдеуді қажет ететін әрбір тапсырма үшін жаңа ағынды бастау өте қымбат. Себебі, PHP ішінде көп ағындылыққа қол жеткізу үшін pthreads ішінде жалпы ештеңе жоқ архитектураны іске асыру қажет. Бұл PHP интерпретаторының ағымдағы данасы (соның ішінде әрбір класс, интерфейс, белгі және функция) барлық орындалу мәтінмәні жасалған әрбір ағын үшін көшірілуі керек дегенді білдіреді. Бұл айтарлықтай өнімділікке әсер ететіндіктен, ағынды әрқашан мүмкіндігінше қайта пайдалану керек. Ағындарды екі жолмен қайта пайдалануға болады: Жұмысшыларды пайдалану немесе Пулдарды пайдалану.

Жұмысшы класы басқа ағында бірнеше тапсырмаларды синхронды түрде орындау үшін пайдаланылады. Бұл жаңа Worker данасын жасау (жаңа ағынды жасайтын), содан кейін тапсырмаларды сол бөлек ағынның стегіне итеру (Worker::stack көмегімен) арқылы орындалады.

Міне, шағын мысал:

Сынып тапсырмасы Threaded (жеке $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Tsk: ($this->value)" кеңейтеді. \n"; ) ) $жұмысшы = жаңа жұмысшы(); $worker->start(); үшін ($i = 0; $i стек(жаңа тапсырма($i)); ) while ($жұмысшы->жинау()); $worker->shutdown();

Жоғарыда келтірілген мысалда жаңа $worker нысанына арналған 15 тапсырма Worker::stack әдісі арқылы стекке итеріледі, содан кейін олар итерілген ретпен өңделеді. Жоғарыда көрсетілгендей Worker::collect әдісі тапсырмаларды орындау аяқтала салысымен оларды тазалау үшін қолданылады. Оның көмегімен уақытша цикл ішінде біз Worker::shutdown деп атамас бұрын, стектегі барлық тапсырмалар орындалып, тазартылғанша негізгі ағынды блоктаймыз. Жұмысшыны мерзімінен бұрын тоқтату (яғни, әлі де орындалатын тапсырмалар бар кезде) барлық тапсырмалар орындалу аяқталғанша негізгі ағынды блоктайды, тек тапсырмалар қоқыс жинамайды (бұл жадтың ағып кетуін білдіреді).

Жұмысшы сыныбы өзінің тапсырмалар стекіне қатысты бірнеше басқа әдістерді қамтамасыз етеді, соның ішінде соңғы жинақталған тапсырманы жоюға арналған Worker::unstack және орындалу стекіндегі тапсырмалар санын алу үшін Worker::getStacked. Жұмысшы стекінде орындалуы қажет тапсырмалар ғана бар. Стектегі тапсырма орындалғаннан кейін ол жойылады және қоқыс жинауға арналған бөлек (ішкі) стекке орналастырылады (Жұмысшы:: жинау әдісі арқылы).

Бірнеше тапсырмалар бойынша ағынды қайта пайдаланудың тағы бір жолы - ағын пулын пайдалану (Пул сыныбы арқылы). Ағын пулы орындалатын тапсырмаларды қосу үшін Жұмысшылар тобын пайдаланады бір мезгілде, онда пул жасалған кезде параллельдік коэффициенті (ол жұмыс істейтін пул ағындарының саны) орнатылады.

Жоғарыдағы мысалды жұмысшылар пулын пайдалану үшін бейімдеп көрейік:

Сынып тапсырмасы Threaded (жеке $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Tsk: ($this->value)" кеңейтеді. \n"; ) ) $пул = жаңа Пул(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $пул->өшіру();

Жұмысшыға қарағанда бассейнді пайдалану кезінде бірнеше елеулі айырмашылықтар бар. Біріншіден, пулды қолмен іске қосудың қажеті жоқ, ол қол жетімді болған кезде тапсырмаларды орындауды бастайды. Екіншіден, біз жіберуемес, бассейнге тапсырмалар оларды стекке қойыңыз. Сонымен қатар, Pool класы Threaded жүйесінен мұраланбайды, сондықтан басқа ағындарға (Жұмысшыдан айырмашылығы) берілмейді.

Жұмысшылар мен бассейндердің тапсырмаларын орындағаннан кейін тез арада тазалау, содан кейін оларды өздері қолмен аяқтау жақсы тәжірибе. Thread сыныбы арқылы жасалған ағындар да негізгі ағынға тіркелуі керек.

pthreads және (im)өзгергіштік

Біз қозғайтын соңғы сынып - бұл ұшқыш, pthreads v3 үшін жаңа қосымша. Өзгермейтіндік pthreads маңызды тұжырымдамаға айналды, өйткені онсыз өнімділік айтарлықтай төмендейді. Сондықтан, әдепкі бойынша, өздері Threaded нысандары болып табылатын Threaded сыныптарының сипаттары енді өзгермейді, сондықтан оларды бастапқы тағайындаудан кейін қайта жазу мүмкін емес. Қазіргі уақытта мұндай сипаттар үшін айқын өзгергіштік қолайлы және оны жаңа Ұшқыш класын пайдалану арқылы әлі де қол жеткізуге болады.

Жаңа өзгермейтін шектеулерді көрсететін мысалды қарастырайық:

Сынып тапсырмасы Threaded файлын кеңейтеді // Threaded класы ( жалпы функция __construct() ( $this->data = new Threaded(); // $this->деректер қайта жазылмайды, себебі ол Threaded класының Threaded қасиеті болып табылады ) ) $task = new class(new Task()) Thread кеңейтеді ( // Threaded класы, себебі Thread кеңейтілген Threaded жалпы функциясы __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); қасиет Threaded класының Threaded мүшесі болып табылады ) );

Екінші жағынан, тұрақсыз класстардың бұрандалы қасиеттері өзгермелі:

Сынып тапсырмасы Ұшқышты кеңейтеді (қоғамдық функция __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // жарамды, өйткені біз тұрақсыз сыныптамыз ) ) $task = new class(new Task()) Thread кеңейтеді ( жалпы функция __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // әлі жарамсыз, өйткені Volatile кеңейтілген Threaded, сондықтан сипат әлі де Threaded класының Threaded мүшесі болып табылады $this->volatileMember = new StdClass() );

Біз Volatile класы Threaded сипаттарын өзгерту мүмкіндігін (сонымен қатар оларды unset()) қамтамасыз ету үшін оның негізгі Threaded класы жүктеген өзгермейтіндікті қайта анықтайтынын көреміз.

Өзгергіштік және өзгергіштік класы - массивтер тақырыбын қамтитын тағы бір талқылау тақырыбы бар. Pthreads ішінде массивтер Threaded класының сипатына тағайындалған кезде автоматты түрде Тұрақты нысандарға шығарылады. Себебі, бірнеше РНР контексттерінің массивін өңдеу қауіпсіз емес.

Кейбір нәрселерді жақсырақ түсіну үшін тағы бір мысалды қарастырайық:

$массив =; $тапсырма = жаңа сынып($массив) Жіпті кеңейтеді ( жеке $деректер; жалпы функция __құрылым(массив $массив) ( $this->деректер = $массив; ) жалпы функция run() ( $this->деректер = 4; $ this->data = 5 print_r($this->data) ); $task->start() && $task->join(); /* Шығару: өзгермелі нысан ( => 1 => 2 => 3 => 4 => 5) */

Тұрақты нысандарды массив сияқты өңдеуге болатынын көреміз, себебі олар жиынтық() операторы сияқты (жоғарыда көрсетілгендей) массив операцияларын қолдайды. Дегенмен, өзгермелі сыныптар array_pop және array_shift сияқты негізгі массив функцияларын қолдамайды. Оның орнына Threaded класы бізге кірістірілген әдістер сияқты операцияларды береді.

Демонстрация ретінде:

$мәліметтер = жаңа сынып Ұшқышты кеңейтеді (қоғамдық $a = 1; жалпы $b = 2; жалпы $c = 3; ); var_dump($деректер); var_dump($data->pop()); var_dump($деректер->shift()); var_dump($деректер); /* Шығару: object(class@anonymous)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) нысаны(сынып@анонимді)#1 (1) (["b"]=> int(2) ) */

Басқа қолдау көрсетілетін операцияларға Threaded::chunk және Threaded::merge кіреді.

Синхрондау

Осы мақаланың соңғы бөлімінде біз pthreads синхрондауды қарастырамыз. Синхрондау - ортақ ресурстарға қол жеткізуді басқаруға мүмкіндік беретін әдіс.

Мысалы, қарапайым есептегішті іске асырайық:

$counter = жаңа сыныпты кеңейтеді Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $counter->start(); үшін ($i = 0; $i i; ) $counter->join(); var_dump($counter->i); // 10-нан 20-ға дейінгі санды басып шығарады

Синхронизацияны қолданбай шығу детерминирленген емес. Бірнеше ағындар бір айнымалыға басқарылатын қатынассыз жазады, яғни жаңартулар жоғалады.

Уақытты қосу арқылы 20-ның дұрыс нәтижесін алу үшін мұны түзетейік:

$counter = жаңа класс Thread кеңейтеді ( жалпы $i = 0; жалпы функцияны іске қосу() ( $this->синхрондалған(функция () ( ($i = 0; $i i; ) )); ) ); $counter->start(); $counter->синхрондалған(функция ($counter) (үшін ($i = 0; $i i; ) ), $counter); $counter->join(); var_dump($counter->i); // int(20)

Синхрондалған код блоктары Threaded::wait және Threaded::notify (немесе Threaded::notifyAll) әдістерін пайдаланып бір-бірімен байланыса алады.

Мұнда екі синхрондалған while цикліндегі балама өсім берілген:

$counter = жаңа сыныпты кеңейтеді Thread ( public $cond = 1; public function run() ( $this->синхрондалған(функция () ( for ($i = 0; $i notify(); if ($this->cond) === 1) ( $this->cond = 2; $this->wait(); ) ) )); $counter->start(); $counter->synchronized(функция ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // бірінші басталуын күтіңіз ) үшін ($i = 10; $i notify(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->join(); /* Шығару: 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 қоңырауының айналасында орналастырылған қосымша шарттарды байқауыңыз мүмкін. Бұл шарттар өте маңызды, себебі олар синхрондалған кері шақыруды ол хабарландыру алған кезде және көрсетілген шарт ақиқат болғанда жалғастыруға мүмкіндік береді. Бұл маңызды, себебі хабарландырулар Threaded::notify шақырылғаннан басқа жерлерден келуі мүмкін. Осылайша, Threaded::wait әдісіне шақырулар шарттарға қосылмаған болса, біз орындаймыз жалған ояту қоңыраулары, бұл болжау мүмкін емес код әрекетіне әкеледі.

Қорытынды

Біз pthreads бумасының бес класын (Threaded, Thread, Worker, Volatile және Pool) және әрбір сыныптың қалай қолданылатынын қарастырдық. Біз сондай-ақ жасалған pthreads өзгермейтін жаңа тұжырымдамасын қарастырдық қысқаша шолуқолдау көрсетілетін синхрондау мүмкіндіктері. Осы негіздерді орындай отырып, біз енді нақты әлемдегі жағдайларда pthreads қалай пайдалануға болатынын қарастыра бастай аламыз! Бұл келесі жазбамыздың тақырыбы болмақ.

Келесі жазбаның аудармасы сізді қызықтырса, маған хабарлаңыз: әлеуметтік желіде пікір қалдырыңыз. желілерде дауыс беріп, жазбаны әріптестеріңізбен және достарыңызбен бөлісіңіз.

Тізбектелген талқылау

А тақырыптық талқылауэлектрондық пікірталас (мысалы, электрондық пошта арқылы, электрондық пошта тізімі, хабарландыру тақтасы , жаңалықтар тобы немесе Интернет форумы ), онда бағдарламалық құрал хабарламаларды көрнекі түрде топтау арқылы пайдаланушыға көмектеседі. Хабарлар әдетте тақырып бойынша иерархияда көрнекі түрде топтастырылады. Осылай топтастырылған хабарламалар жиыны а деп аталады тақырып тізбегінемесе жай ғана «жіп». Пікірталас форумында, электрондық пошта клиентінде немесе жаңалықтар клиентінде, егер ол бір тақырыптағы хабарларды осылайша оңай оқу үшін бірге топтаса, «жіпті тақырыптар» бар деп аталады. Сонымен қатар, ағынды талқылаулар әдетте пайдаланушыларға тақырып ағынындағы белгілі бір хабарламаға жауап беруге мүмкіндік береді. Нәтижесінде, ағын тақырыбының ішінде талқылаулар иерархиясы болуы мүмкін. Бағдарламалық құралдың әртүрлі түрлері бұл иерархияны неде көрсетуге мүмкіндік береді. бұрандалы режим деп аталады. (Әдетте кімнің кімге нақты жауап бергеніне қарамастан барлық жазбаларды күн тәртібімен көрсететін Сызықтық режим балама болып табылады.)

Артықшылықтары

Иерархиялық ағынды көріністердің артықшылығы - олар оқырманға әңгіменің жалпы құрылымын жылдам бағалауға мүмкіндік береді: нақтырақ айтқанда, кім кімге жауап береді. Осылайша, бұл жаңалықтар топтары сияқты кеңейтілген әңгімелер немесе пікірталастар жағдайында өте пайдалы: шынында да, шын мәнінде күрделі пікірталас үшін, иерархиялық жүйенің қандай да бір түрінсіз дәлелді қадағалау мүмкін емес.

Тағы бір артықшылық - иерархиялық ағынды жүйелердегі қауымдастықты неғұрлым нәзік бағалау. Жауаптар белгілі бір хабарламаларға берілуі керек болғандықтан, олар нақты адамдарға да беріледі. Сондықтан ағынды әңгімелер жазушыны жауап беретін адамның нақты көзқарастары мен тұлғасына бағыттайды. Бұл соңғы түсініктеме жалпы пулға енгізілген форумдарда азырақ болады.

Кемшіліктері

Тегіс жіппен салыстырғанда иерархиялық жіптің кемшілігі күрделіліктің жоғарылау деңгейі болып табылады, сондықтан мұндай көрініс пайдаланушылар тарапынан жоғарырақ жайлылық пен талғампаздық деңгейін талап етеді. Сондықтан Usenet, CIX немесе Slashdot сияқты ең көне және/немесе ең күрделі желілік қауымдастықтарда оның қабылдануы ең ауыр болғаны таңқаларлық емес. Веб чат және түсініктеме жүйелері, салыстырмалы түрде, жас және кеңірек аудитория үшін ашық, сондықтан иерархиялық ағындар мұндай ареналарда жақында ғана үйреншікті болып келеді.

Ағаш иерархиясын орнату сонымен қатар тақырып ішіндегі талқылауды бөлшектеуге бейім: бұдан былай бірнеше әртүрлі алдыңғы жазбаларға жауап беретін немесе қорытындылайтын хабарламаны жариялау мүмкін болмайды. Оның орнына әрбір алдыңғы жазбаға жеке жауап беру керек. Бұл иерархиялық ағынды пайдаланатын форумдардағы қарама-қайшылықты пікірталас стиліне әкеледі деген дау бар. Дегенмен, дұрыс болса да, егер қалаған жазбаға жауаптардың көлеміне байланысты тікелей ағынды жауап беру мүмкін болмаса, пайдаланушылар сөйлесуді жолда және ағынды сақтау үшін жиі жауап беріп жатқан адамның тырнақшаларын пайдаланады. тегіс Бұл ағынның басқаша толық шегіне жеткен жағдайда хабарлар тақтасының қауымдастықтарының көпшілігімен ұсынылады.

Ашық жіп

Ашық тақырып оқырмандар өздері таңдаған кез келген тақырыпқа түсініктеме беріп, талқылай алатын блог жазбасын білдіреді. Олар әдетте үлкен көлемдегі танымал блогтарда пайдалырақ қозғалыс; олар көбінесе блог авторының жариялайтын тақырыбы болмаған кезде немесе жариялауда тыныштық болған кезде қолданылады.

Ашық ағындар блогтардың негізгі беттеріндегі жазбалардың монотондылығын жою үшін де қолданылады. Пікірлер мазмұнға бағытталған посттарда жиналуы мүмкін; сондықтан авторлар бетті жүктеу уақыттары бәсеңдемейтіндей ашық ағындарды пайдаланады.

Мысалдар

*Yahoo! Топтар [ http://groups.yahoo.com/], MSN топтары [ http://groups.msn.com/] және Slashdot [ http://www.slashdot.com/] барлығы ағынды талқылауларды көрсететін веб-негізделген форумдарды ұсынады.

Сондай-ақ қараңыз

*Scholarly Skywriting
* Блог жүргізу шарттарының тізімі

Анықтамалар

*Дартмут. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Интернеттегі талқылау" ]
*Волси, Т.Девере, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html «Киберкеңістіктегі әдебиет талқылауы: кітаптар туралы әңгімелесу үшін ағынды пікірталас топтарын пайдаланатын жас жасөспірімдер]. "Онлайн оқу", 7(4), қаңтар/ақпан 2004. Тексерілді 30 желтоқсан 2007 ж.

Викимедиа қоры.

  • 2010.
  • Леон Пау

Барх Азум

    Басқа сөздіктерді қараңыз:Интернет-форум

    - phpBB Интернет форумының бағдарламалық пакеті, ең танымал форум пакеттерінің бірі… WikipediaВиртуалды оқыту ортасының тарихы 1990 ж

    - Виртуалды оқыту орталарының тарихында 1990 жылдар ең алдымен қолжетімді компьютер мен Интернеттің пайда болуына байланысты өсу уақыты болды. 1990s1990* Formal Systems Inc. Принстон, Нью-Джерси, АҚШ DOS негізіндегі бағалауды енгізеді… … Wikipedia- Бірлескен Face to Face Educational Environment Developer(лар) LEAD консорциумы Тұрақты шығарылым 5.0 / маусым 2010 Операциялық жүйе Кросс-платформа … Wikipedia

    Сөйлесу ағыны- көптеген электрондық пошта клиенттері, хабарландыру тақталары, жаңалықтар топтары немесе интернет форумдары пайдаланатын мүмкіндік, онда бағдарламалық құрал хабарламаларды көрнекі топтау арқылы пайдаланушыға көмектеседі. Хабарлар әдетте тақырып бойынша иерархияда көрнекі түрде топтастырылады. Топтастырылған хабарлар жинағы... ... Wikipedia

    Slashdot- Slashdot.org басты бетінің скриншоты URL slashdot.org слоган Жаңалықтар үшін. Маңызды нәрселер... Wikipedia

    MediaWiki- аттар кеңістігі осында қайта бағытталады. Уикипедиядағы MediaWiki аттар кеңістігіне қатысты анықтама алу үшін Анықтама:MediaWiki аттар кеңістігі бөлімін қараңыз. Уикипедия аттар кеңістігі туралы жалпы ақпаратты Уикипедия:Аттар кеңістігі бөлімінен қараңыз. Талқылау беті мен MediaWiki талқылау беті осы жерден қайта бағытталады. ... ... Wikipedia үшін

    Компьютерлік байланыс- Басқа пайдалану үшін CMC (анықтама) бөлімін қараңыз. Компьютерлік делдалдық байланыс (CMC) екі немесе одан да көп желілік компьютерлерді пайдалану арқылы жүзеге асырылатын кез келген коммуникативті транзакция ретінде анықталады. Бұл термин дәстүрлі түрде мыналарға сілтеме жасағанымен… … Wikipedia

    Вики бағдарламалық жасақтамасын салыстыру- Келесі кестелер бірқатар вики бағдарламалық пакеттері үшін жалпы және техникалық ақпаратты салыстырады. Мазмұны 1 Жалпы ақпарат 2 Мақсатты аудитория 3 Мүмкіндіктер 1 4 Мүмкіндіктер 2 ... Wikipedia

    Ғылыми Skywriting- бұл когнитивті ғалым Стиван Харнад ойлап тапқан термин, бірнеше электрондық поштаның және жаңалықтар тобы, электрондық тарату тізімі, гиперпочта, netnews немесе Интернет форумы сияқты тақырыптық веб-мұрағаттың тіркесімін сипаттайтын, сілтеме жасалған және күні бойынша сұрыпталатын,… … Wikipedia

    Бірлескен шешім қабылдауға арналған бағдарламалық қамтамасыз ету- Бірлескен шешім қабылдау (CDM) бағдарламалық жасақтамасы – барлық тиісті мүдделі тараптардың процеске қатысуына мүмкіндік беретін, дер кезінде ұжымдық шешімдер қабылдау үшін қажетті функциялар мен мүмкіндіктерді үйлестіретін бағдарламалық құрал немесе модуль. The... ... Wikipedia

Мен жақында pthreads қолданып көрдім және жағымды таң қалдым - бұл PHP-де бірнеше нақты ағындармен жұмыс істеу мүмкіндігін қосатын кеңейтім. Ешқандай эмуляция, сиқыр жоқ, жалғандық жоқ - бәрі шынайы.



Мен осындай тапсырманы қарастырып жатырмын. Жылдам орындалуы керек тапсырмалардың көптігі бар. РНР-де бұл мәселені шешуге арналған басқа да құралдар бар, олар мұнда айтылмаған, мақала pthreads туралы.



Жіптер дегеніміз не

Міне бітті! Жақсы, барлығы дерлік. Шынында да, ізденімпаз оқырманды ренжітетін бір жайт бар. Бұлардың ешқайсысы әдепкі опциялармен құрастырылған стандартты PHP-де жұмыс істемейді. Көп ағынды пайдалану үшін PHP жүйесінде ZTS (Zend Thread Safety) қосылған болуы керек.

PHP орнату

Келесі, ZTS бар PHP. ZTS жоқ PHP (37,65 қарсы 265,05 секунд) салыстырғанда орындалу уақытының үлкен айырмашылығына қарсы болмаңыз, мен PHP орнатуды жалпылауға тырыспадым. ZTS жоқ жағдайда, мысалы, менде XDebug қосылған.


Көріп отырғаныңыздай, 2 ағынды пайдаланған кезде бағдарламаның орындалу жылдамдығы сызықтық код жағдайына қарағанда шамамен 1,5 есе жоғары. 4 жіпті пайдаланған кезде - 3 рет.


Процессор 8 ядролы болса да, 4-тен көп ағын пайдаланылса, бағдарламаның орындалу уақыты дерлік өзгеріссіз қалғанын атап өтуге болады. Бұл менің процессорымның 4 физикалық ядросы бар екеніне байланысты сияқты, мен пластинаны диаграмма түрінде бейнеледім.


Резюме

PHP-де pthreads кеңейтімін қолданып, көп ағынмен өте талғампаз жұмыс істеуге болады. Бұл өнімділіктің айтарлықтай өсуін қамтамасыз етеді.

Тегтер: тегтерді қосыңыз

Менің жақсы досымның анасы Санкт-Петербургтен Мәскеуге ұшатын ұшағында чемоданын жоғалтып алды және ол жылы жағалауға ұшты, ал қазір ол курортта болды - купальниксіз, сандалсыз және тек Т. - қол жүгінен көйлек. Ескі күндер үшін мен оған не істеу керек және қайда жүгіру керектігі туралы бірнеше кеңес бердім және бүгін осы тақырып бойынша білетінімнің бәрін жазуды шештім.

Менің қай жерде соншалықты ақылды екенімді түсіндіру үшін бір кездері бірнеше авиакомпаниялардың жерүсті қызметтерінде жұмыс істегенімді, соның ішінде багажды іздеуге қатысты кейбір мәселелермен айналысқанымды еске салайын. Әрине, өзімнің ұшу тәжірибем. Алайда, өйткені Мен авиациялық қызмет көрсету саласын бірнеше жыл бұрын тастадым, мүмкін кейбір нюанстар өзгерген болуы мүмкін - егер солай болса, мен тақырып бойынша пікірлерді ризашылықпен қабылдап, посттағы ақпаратты түзетемін.

Мен осыдан бастайын Жүкті жоғалтпау үшін не істеу керек:
1. Чемоданыңыздан алдыңғы сапарлардағы барлық белгілер мен жапсырмаларды, тіпті штрих-коды бар кішкентайларды да жыртып алыңыз, олар көбінесе чемоданның өзіне бөлек жабыстырылады - олар багажды автоматты түрде сканерлеу және сұрыптау жүйесін шатастыруы мүмкін.
2. Чемоданыңызға атау белгісін іліп қойыңыз (сөмке, қорап, пакет – жалпы алғанда, багаж ретінде тіркелетіндердің барлығы): алдын ала қайта пайдалануға болатын опцияны сатып алуға немесе тіркеу кассасында қағаз жапсырманы алуға болады – әдетте барлығы жартылай лайықты авиакомпаниялар оларды шектеусіз береді. Ал Эмираттарда, мысалы, өте ұзақ уақытқа созылатын берік сымда тамаша пластик белгілері бар:

Ескі параноидтар мен сияқты істей алады: менің чемоданымда үнемі үй мекен-жайым, телефон нөмірім және Samsonite жиынтығынан қайта пайдалануға болатын пластик белгісі бар. электрондық пошта арқылы, және мен демалыста бір жерге ұшқанда, мен қосымша қағазды іліп қоямын, онда мен жаңа жерде болатын күндерді және барлық мүмкін контактілерді (қонақүйдің атауы мен мекенжайы, оның жергілікті телефон нөмірі, егер бар болса, және менің аты-жөнім, әрине).
3. Тіркеу кассасында сіздің багажыңыздың тіркеу агенті басып шығаратын багаж белгісімен – сіз ұшып бара жатқан қала коды және рейс нөмірімен жапсырылғанына көз жеткізіңіз.
4. Егер сізде бірнеше қосылатын рейс болса, тіркеу агентіне бұл туралы айтып, багажыңызды қай пунктке тексергіңіз келетінін көрсетіңіз. Кейбір жағдайларда багажды сіздің қалауыңызға қарамастан, бағыт бойынша сол немесе басқа әуежайдан алуға тура келеді: бұл, мысалы, әуежайлар арасындағы трансферлерге қатысты (Париждегі Орли және Шарль де Голль, Домодедово - Шереметьево - «Внуково»). « Мәскеуде), бөлек терминалдар (Франкфурттағы 1 және 2 терминалдар) немесе АҚШ-қа немесе Мексикаға келудің бірінші нүктесінде - бұл осы елдердегі кедендік талап: сіз Мәскеу-Вашингтон-Феникс ұшағымен ұшып жатырсыз делік, багаж белгісі. Финикске барлық үш сегмент үшін беріледі, бірақ Вашингтонда жүкті физикалық түрде алып, кеденнен өткізу және қайтадан тексеру қажет, егер сіз ұшақтан бұрын алуға рұқсат етілген нәресте арбасын тексеріп жатсаңыз , немесе жануар болса, оны транзиттік пункттен алу қажет болуы мүмкін. Тұтастай алғанда, аударымдары бар күрделі маршрут жағдайында, әуе компаниясының байланыс орталығында немесе төтенше жағдайларда, тіркеу кезінде багаждың қозғалысы туралы мәліметтерді алдын ала нақтылаған дұрыс.
5. Жүгіңізді көрінетін етіп жасаңыз: багаждың кешігуі әрқашан багажды өңдеушілердің кінәсі немесе сұрыптау жүйесіндегі ақаулар емес. Кейде ұзақ рейстен шаршаған тағы бір бейхабар жолаушы багаж белбеуінен сіздікіндей қара самсонит немесе қарапайым спорт сөмкесін алып кетеді. Сондықтан, багажыңызды белгілеңіз: тұтқаға бірнеше жарқын лента немесе кішкентай жұмсақ ойыншық іліңіз, оған үлкен жапсырма жабыстырыңыз немесе чемоданды таңдағанда әдеттен тыс түске артықшылық беріңіз.

Жүкте нені тексеруге болмайды?
Есіңізде болсын, барлық авиакомпаниялар мен әуежайлар багажды жоғалтады. Әрине, статистика әркім үшін әр түрлі, бірақ ең сенімді авиакомпаниялар да багажды жоғалтып алуы немесе кешіктіруі мүмкін, тіпті ең кішкентай әуежайда да бір багажды өңдеуші чемодандары бар арбаны тіркеу кассасынан тікелей ұшаққа апарады. Сондықтан мен сізге әрқашан қол жүгіңізді алып жүруге кеңес беремін:
- маңызды құжаттар, соның ішінде ұшу кезінде қажет емес құжаттар (мысалы, Санкт-Петербургке соңғы сапарымда мен лицензиямды өзгертуім керек болды, мен өзімнің қол жүгіме неке туралы куәлікті және әр түрлі карталарды алдым. автокөлік мектебі)
- кілттер (мекен-жайы бар тегпен бірге бұл қауіпті болуы мүмкін)
- ақша, зергерлік бұйымдар (пікірлер жоқ)
- қымбат нәзік жабдық
- шетелде немесе қалада аналогын іздеуге тура келген жағдайда, ұшуға қажетті мөлшерде және шағын резервпен үнемі қабылдайтын дәрілер. Сіздің багажыңыз жоғалған жағдайда сатып алынбайтын рецепт бойынша дәрі-дәрмектерді бүкіл сапарға қажетті мөлшерде өзіңізбен бірге алыңыз.
- келген кезде шұғыл қажет болуы мүмкін нәрсе (мысалы, зарядтағыштелефон үшін
- жеке өзіңіз үшін сентименталды құндылығы бар нәрсе: кейде жүк біржола жоғалып кетеді, ал егер жеке күнделіктен айырылу жүрегіңізді ауыртса, оны үйде қалдырғаныңыз немесе ұшақта өзіңізбен бірге алғаныңыз дұрыс.

Ғибратты оқиға: мен Санкт-Петербургтегі Lufthansa компаниясында жұмыс істеп жүрген кезімде АҚШ-тан ерлі-зайыптылар біздің кеңсеге қолдарын бұлғап жүгіріп келді - олардың бала асырап алу бойынша сот процесіне өте маңызды құжаттары бар багажы келмеген, сот келесі күні болды. Әрине, жүктің жоғалуына әуе компаниясы кінәлі, бірақ бұл кімге тиімді? Мұндай жағдайды болдырмау үшін қол жүгіңізге маңызды қағаздарды салу жеткілікті болды.

Сонымен, сіз келдіңіз және жүк белбеуінен жүктеріңізді таппай қалдыңыз. Не істеу керек?
1. Егер сіз багажыңызда қарапайым чемодандардан басқа бірдеңені: шаңғылар, виолончель, қабырға өлшеміндегі плазмалық панель, балалар арбасы, тірі мәрмәр Great Dane тексерген болсаңыз, деп аталатындарды беру үшін бөлек нүкте бар-жоғын тексеріңіз. габаритті багаж немесе көлемді багаж - жоғарыда сипатталғанға ұқсас багаж көбінесе жеке бөлімге тиеледі және бөлек, қолмен түсіріледі. Егер сіздің багажыңыз ол жерден табылмаса
2. Жүкті іздеуге немесе Жоғалған және табылған есептегішке өтіңіз. Онда сіз арнайы форманы толтыруыңыз керек егжей-тегжейлі ақпаратСіздің багажыңыз туралы: маршрут, сыртқы түрі, мазмұнының қысқаша тізімі, тұрақты тұрғылықты жеріңіздегі және уақытша болатын жеріңіздегі контактілер. Сондай-ақ, багажды іздеу қызметінде сіз келесідей жолжүк кестесін көресіз:

Дәл осы классификацияға сәйкес сіздің жоғалған багажыңыз кодталады және сіз түсінесіз, бұл екі чемодан бірдей кодталады:

Сондықтан сипаттамаға қосымша мәліметтерді қосудан тартынбаңыз және мазмұн тармағын өткізіп алмаңыз. Әдетте, сіз багажды кешіктіру туралы хаттаманы бірінші рет толтырған кезде, сыртында сәйкестендіру белгілері болмаса және сөмкені ашу қажет болса, сөмкеңізді анықтауға болатын бірнеше мазмұнды көрсету сұралады (егер сөмке ашылды, сіз бұл туралы хабарлама жібересіз). Жаман мысал: футболка / кітап / дымқыл майлықтар, жақсы үлгі: ашық қызыл бикини / Малевич репродукцияларының каталогы / жиналмалы үтік. Өтінішті толтырғаннан кейін багажды қадағалау қызметінің қызметкері сізге XXXYY11111 пішіміндегі нөмірді береді, мұнда XXX - келу әуежайының коды, YY - келу әуе компаниясының коды + өтінімнің сериялық нөмірінің 5 саны: мысалы, JFKLH12345, егер Сіз Lufthansa компаниясымен Нью-Йорктегі Кеннеди әуежайына ұштыңыз. Бұл нөмірді есте сақтаңыз немесе жазып алыңыз - бұл болашақ қосымшаларда өтінішіңізді табудың ең оңай жолы болады.
Сол нөмірді пайдаланып іздеу күйін ӨЗІҢІЗ тексере аласыз (белгілі бір себептермен сілтеме жоғалып кетеді: егер ол сіз үшін жұмыс істемесе, Google World Tracer Online және сөзбе-сөз екінші сілтеме - worldtracer.aero веб-сайтындағы Baggage Tracing айдарымен - сізге қажет), өйткені жоғалған және табылған күйге өту жиі өте қиын
3. Келетін әуежайдағы авиакомпанияңыздың кеңсесіне хабарласып көріңіз: кейде (ерекше айтамын – КЕЙДЕ!) егер сіз үйге ұшпаған болсаңыз, бірақ уақытша болатын жерге (демалыс, іссапар), авиакомпания жиынтық бере алады. дәретхана керек-жарақтары (Lufthansa компаниясында үлкен көлемді футболка, тіс щеткасы мен пастасы, тарақ, сусабын мен душқа арналған гельдің шағын пакеттері, кір жуғыш ұнтақ және т.б. бар) немесе шағын шығындар үшін аз ақша төлеңіз. спот (спот қолма-қол төлем).

Әрі қарай не болады?
Сіздің файлыңыз (AHL деп аталатын) орталықтандырылған багажды іздеу жүйесіне (World Tracer) өтеді. Барлық талап етілмеген жүктер, олар багаж алаңының бұрыштары мен бұрыштарында таңбасыз табылғанына немесе осы заттардың әрқайсысы үшін жолжүк белбеуінде қалғанына қарамастан, бір іздеу жүйесіне түседі, XXXYY11111 форматындағы файл; сондай-ақ құрылды, тек басқа түрдегі - деп аталатын. қолдағы есеп немесе OHD. Егер AHL және OHD файлдарының деректері сәйкес келсе (тегі, чемоданның сипаттамасы, маршрут және т. бұл технология мәселесі: қайта тексеру және сәтті болған жағдайда багажды қалаған қалаға жөнелту. Әрине, үлкен саны өздігінен жасалған- хабар алмасу, ұқсас, бірақ бірдей емес чемодандарды қабылдамау, сонымен қатар бірнешеге жауаптар телефон қоңыраулары– Жалпы, багажды іздеу қызметінің қызметкерлері ешқашан жалықпайды.
Шамамен статистика: жоғалған жүктің 90%-дан астамы іздеудің алғашқы 3 күнінде табылса, 3%-ы мәңгілікке жоғалады.
Сіз не істей аласыз?
1. Келгеннен кейін шұғыл түрде қажет нәрсені (тіс щеткасынан іскерлік костюмге дейін) сатып алу қажет болса, кейінірек өтемақы алу үшін түбіртегіңізді сақтаңыз. Дегенмен, қажетсіз қымбат сатып алулардан аулақ болу керек, себебін кейінірек түсіндіремін.
2. Жаңа қадамдарды орындап, мазмұнының ең егжей-тегжейлі тізімін жасаңыз, жақсырақ түсі, бренді және шамамен құныӘрбір элемент, ең дұрысы, ағылшын тілінде (әйтпесе, авиакомпания қызметкері жүйеге кіру үшін осы тізімді аударуы керек), әуе компаниясына хабарласыңыз және оларға осы тізімді жіберіңіз, ол багажды іздеу қосымшасына қосылады. Алғашқы 5 күнде багажды іздеуді келу әуежайы жүзеге асырады, содан кейін іздеуді тасымалдаушы авиакомпания (өтініш нөмірінде көрсетілген авиакомпания – JFKLH12345 есіңізде ме?) жауапкершілігіне алады, ал 21 күннен кейін сіз түпкілікті өтемақы алуға өтініш бере алады.
3. Жоғалған багаж туралы арыз берілген күннен бастап 21 күн өткеннен кейін ол табылмаса, өтемақы талап ету үшін тасымалдаушы авиакомпанияға хабарласыңыз. Қателеспесем, ескіру мерзімі 2 жыл, яғни. Сіз залал туралы талап арыз берген күннен бастап екі жыл ішінде өтемақы алуға өтініш бере аласыз.

Өтемақы төлеу.
Өтемақы төлеу үшін сізге төлем туралы өтінішпен, рейсті растайтын құжаттармен және багажды жоғалту фактісімен (отырғызу талондары, багаж біркалары, багажды жоғалту туралы талап нөмірі, төлем деректемелері) авиакомпанияның өкілдігіне хабарласу қажет. Қателеспесем, Ресей Федерациясында өтемақы туралы шешім заңды түрде 30 күн ішінде қаралуы керек. Сондай-ақ, сізден мазмұнның құнын бағалауды және мүмкін болса, чемоданды және ондағы заттарды сатып алу туралы түбіртектерді ұсынуды сұрауы мүмкін (бұл көп жағдайда шындыққа жанаспайтынын түсінемін, бірақ бұл процедураның бөлігі).
Бұған дейін төлемдер тексерілген багаждың салмағына қарай жүргізілетін – бір келіге шамамен 20 доллар. Кейінірек төлем жүйесі өзгертілді және авиакомпаниялардың жауапкершілігі 1000 шартты бірлікпен шектелді (шартты бірлік құны авиакомпания ішінде есептеледі), бұл менің жұмысым кезінде шамамен 1300 еуроға сәйкес болды. Сол. мың боливиялық геккон терісінен жасалған және гауһар тастармен толтырылған Louis Vuitton чемоданын сатып алу туралы түбіртек әкелсеңіз де, сіз 1300 еуродан артық ақша ала алмайсыз.