Арчаагүй хэлэлцүүлгийн сэдэв php. Pthreads орчуулгатай PHP хэл дээрх олон урсгалтай програмчлал

Би саяхан pthreads-ийг туршиж үзсэн бөгөөд маш их гайхсан - энэ нь PHP дээр олон бодит thread-тэй ажиллах чадварыг нэмсэн өргөтгөл юм. Ямар ч дууриамал, ид шид, хуурамч зүйл байхгүй - бүх зүйл бодит юм.



Би ийм даалгавар бодож байгаа. Хурдан дуусгах шаардлагатай олон ажлууд бий. PHP нь энэ асуудлыг шийдэх өөр хэрэгслүүдтэй бөгөөд тэдгээрийг энд дурдаагүй, нийтлэл нь pthreads-ийн тухай юм.



pthreads гэж юу вэ

Тэгээд л болоо! За, бараг бүх зүйл. Ер нь сониуч уншигчийг бухимдуулах зүйл бий. Эдгээрийн аль нь ч өгөгдмөл сонголтоор эмхэтгэсэн стандарт PHP дээр ажиллахгүй. Олон урсгалыг ашиглахын тулд та PHP дээрээ ZTS (Zend Thread Safety)-г идэвхжүүлсэн байх ёстой.

PHP тохиргоо

Дараа нь ZTS-тэй PHP. ZTS-гүй PHP (37.65 vs 265.05 секунд)-тэй харьцуулахад гүйцэтгэлийн хугацааны том ялгааг бүү бодоорой, би PHP тохиргоог ерөнхийд нь хэлэхийг оролдоогүй. ZTS-гүй тохиолдолд би жишээ нь XDebug-г идэвхжүүлсэн байна.


Таны харж байгаагаар 2 урсгалыг ашиглах үед програмын гүйцэтгэлийн хурд шугаман кодтой харьцуулахад ойролцоогоор 1.5 дахин их байна. 4 утас ашиглах үед - 3 удаа.


Процессор нь 8 цөмт байсан ч 4-өөс дээш утас ашигласан тохиолдолд програмын ажиллах хугацаа бараг өөрчлөгдөөгүй хэвээр байгааг та тэмдэглэж болно. Энэ нь миний процессор 4 физик цөмтэй болсонтой холбоотой юм шиг байна.Тодорхой болгохын тулд би хавтанг диаграмм хэлбэрээр дүрсэлсэн.


Дүгнэлт

PHP хэл дээр pthreads өргөтгөлийг ашиглан олон урсгалтай ажиллах боломжтой. Энэ нь бүтээмжийг мэдэгдэхүйц нэмэгдүүлэх боломжийг олгодог.

Шошго: шошго нэмэх

Миний нэг сайн найзын ээж Санкт-Петербургээс Москва руу нисч байхдаа чемоданаа алдаж, дулаан эрэг рүү нисч, одоо аль хэдийнээ амралтын газарт байсан - усны хувцас, шаахай, зөвхөн Т-тэй. - гар тээшнээс нь цамц. Эрт дээр үед би түүнд юу хийх, хаашаа гүйх талаар хэд хэдэн зөвлөгөө өгсөн бөгөөд өнөөдөр би тухайн сэдвээр мэддэг бүх зүйлээ энд бичихээр шийдлээ.

Би хаана ийм ухаантай байгаагаа тайлбарлахын тулд би нэг удаа хэд хэдэн агаарын тээврийн компанид газар тээшний эрэл хайгуултай холбоотой зарим асуудлыг шийдэж байсныг сануулъя. Мэдээжийн хэрэг, миний өөрийн нислэгийн туршлага. Гэсэн хэдий ч, учир нь Би нисэхийн үйлчилгээний салбарыг хэдэн жилийн өмнө орхисон, магадгүй зарим нэг нюансууд өөрчлөгдсөн байж магадгүй - хэрэв тийм бол би сэдвийн талаархи сэтгэгдлийг талархан хүлээн авч, нийтлэл дэх мэдээллийг засах болно.

Би эндээс эхэлье Ачаа тээшээ алдахаас сэргийлэхийн тулд юу хийх хэрэгтэй вэ:
1. Өмнөх аяллын бүх шошго, наалтыг чемоданаасаа урж ав, тэр ч байтугай жижиг зураасан кодтой, чемодандаа тусад нь наасан байдаг - энэ нь ачаа тээшийг сканнердах, ангилах автомат системийг төөрөлдүүлж болзошгүй юм.
2. Чемодан дээрээ нэрийн шошго өлгөх (цүнх, хайрцаг, багц - ерөнхийдөө ачаа тээш болгон бүртгүүлэх бүх зүйл): та дахин ашиглах боломжтой сонголтыг урьдчилан худалдаж авах эсвэл бүртгэлийн лангуун дээр цаасан шошго авч болно - ихэвчлэн бүгд илүү их эсвэл бага зохистой агаарын тээврийн компаниуд тэднийг хязгаарлалтгүйгээр гаргадаг. Жишээлбэл, Эмират нь удаан эдэлгээтэй утасн дээр маш сайн хуванцар шошготой байдаг:

Хөгшин гаж донтон хүмүүс над шиг хийж чадна: Миний чемодан дээр үргэлж гэрийн хаяг, утасны дугаар, цахим шуудан бүхий дахин ашиглах боломжтой хуванцар шошго өлгөөтэй байдаг бөгөөд амралтаараа хаа нэг газар нисэхдээ би цаас өлгөдөг. миний шинэ газарт байх огноо, боломжтой бүх холбоо барих хаягийг (зочид буудлын нэр, хаяг, хэрэв байгаа бол орон нутгийн утасны дугаар, мэдээжийн хэрэг таны овог нэр) зааж өгнө үү.
3. Бүртгэлийн лангуун дээр бүртгүүлэгчийн хэвлэсэн тээшний шошгыг ачаа тээшиндээ наасан эсэхийг шалгаарай - таны нисэх гэж буй хотын код, нислэгийн дугаар.
4. Хэрэв танд хэд хэдэн холболтын нислэг байгаа бол энэ тухайгаа бүртгүүлэгчдээ хэлж, аль цэгт ачаа тээшээ шалгахыг хүсч байгаагаа зааж өгнө үү. Зарим тохиолдолд ачаа тээшийг таны хүслээс үл хамааран маршрутын дагуу нэг эсвэл өөр нисэх онгоцны буудлаас авах шаардлагатай болно: энэ нь жишээлбэл, нисэх онгоцны буудлуудын хооронд шилжүүлэхэд хамаарна (Парисын Орли ба Шарль де Голль, Домодедово - Шереметьево - "Внуково. " Москвад), тусдаа терминалууд (Франкфуртын 1 ба 2-р терминал) эсвэл АНУ эсвэл Мексикт ирэх эхний цэг дээр - энэ нь эдгээр орнуудын гаалийн шаардлага юм: та Москва-Вашингтон-Феникс чиглэлд нисч байна гэж бодъё, ачаа тээшний шошго. Энэ нь Финикс рүү бүх гурван сегментэд зориулагдсан боловч Вашингтонд ачаа тээшийг биечлэн авч, гаалийн бүрдүүлэлт хийж, дахин бүртгүүлэх шаардлагатай. Мөн хэрэв та хөлөг онгоцонд суухаас өмнө авахыг зөвшөөрсөн хүүхдийн тэргийг шалгаж байгаа бол Онгоц эсвэл амьтан бол та үүнийг дамжин өнгөрөх цэгээс авах хэрэгтэй болно. Ерөнхийдөө, шилжүүлэг бүхий нарийн төвөгтэй маршрутын хувьд агаарын тээврийн компанийн дуудлагын төвд эсвэл онцгой тохиолдолд бүртгүүлэх үед ачаа тээшний хөдөлгөөний дэлгэрэнгүй мэдээллийг урьдчилан тодруулах нь дээр.
5. Ачаа тээшээ харагдахуйц болго: Ачаа тээшний саатал нь ачаа тээшний ажилчдын буруу эсвэл ангилах системд алдаа гардаггүй. Заримдаа удаан нислэгийн дараа ядарсан өөр нэг хайхрамжгүй зорчигч ачаа тээшнээс таныхтай ижил хар Самсонит эсвэл энгийн спортын цүнхийг авдаг. Тиймээс ачаа тээшээ тэмдэглээрэй: бариул дээр олон тод тууз эсвэл жижиг зөөлөн тоглоом өлгөж, том наалт нааж эсвэл чемодан сонгохдоо ер бусын өнгийг илүүд үзээрэй.

Ачаа тээшинд юуг шалгаж болохгүй вэ?
Бүх агаарын тээврийн компаниуд болон нисэх онгоцны буудлууд ачаа тээшээ алддаг гэдгийг санаарай. Мэдээжийн хэрэг, статистик нь хүн бүрт өөр өөр байдаг ч хамгийн найдвартай агаарын тээврийн компаниуд ч гэсэн ачаа тээшээ алдах эсвэл хойшлуулах, тэр ч байтугай хамгийн жижиг нисэх онгоцны буудалд ч гэсэн ганц ачаа тээшний ажилтан чемодантай тэргийг шалгах цэгээс шууд онгоц руу зөөдөг. Тиймээс би танд үргэлж гар тээшээ авч явахыг зөвлөж байна.
- Нислэгийн үеэр шаардлагагүй чухал бичиг баримтууд (жишээлбэл, Санкт-Петербургт хийсэн сүүлчийн аялалдаа би үнэмлэхээ солих шаардлагатай болсон бөгөөд гэрлэлтийн гэрчилгээ, бүх төрлийн картыг гар тээшиндээ авч явсан. жолооны сургууль)
- түлхүүрүүд (таны хаягтай шошготой хослуулан энэ нь аюултай байж болно)
- мөнгө, үнэт эдлэл (сэтгэгдэл байхгүй)
- үнэтэй эмзэг тоног төхөөрөмж
- Нислэгт шаардагдах хэмжээгээр, гадаад улс, хотод аналог хайх шаардлагатай тохиолдолд бага хэмжээний нөөцтэй тогтмол хэрэглэдэг эмүүд. Ачаа гээсэн тохиолдолд худалдаж авах боломжгүй эмийн жороор бүх аялалд шаардагдах хэмжээгээр авч яваарай.
- ирэхэд танд яаралтай хэрэгтэй байж болох зүйл (жишээлбэл, утасны цэнэглэгч
- Таны хувьд сэтгэлийн үнэ цэнтэй зүйл: заримдаа ачаа үүрд алга болдог, хэрэв хувийн өдрийн тэмдэглэлээ алдах нь таны зүрхийг шархлуулж байвал гэртээ үлдээх эсвэл онгоцонд авч явах нь дээр.

Сургамжтай түүх: Намайг Санкт-Петербургт Lufthansa-д ажиллаж байх үед АНУ-аас гэрлэсэн хосууд манай оффис руу гүйж ирээд гараа нугалж байсан - үрчлэлтийн шүүх хуралд маш чухал бичиг баримт агуулсан ачаа тээш нь ирээгүй, шүүх хурал маргааш болсон. Мэдээжийн хэрэг, ачаа тээш алдагдсанд агаарын тээврийн компани буруутай, гэхдээ энэ нь хэнд ашигтай вэ? Ийм нөхцөл байдлаас зайлсхийхийн тулд гар тээшиндээ чухал бичиг баримтуудыг хийхэд л хангалттай.

Тиймээс, та ирээд ачаа тээшний бүсээс ачаагаа олсонгүй. Юу хийх вэ?
1. Хэрэв та ачаа тээшиндээ энгийн чемоданаас өөр зүйл хийсэн бол: цана, морин хуур, ханын хэмжээтэй плазма хавтан, хүүхдийн тэрэг, амьд гантиг Great Dane, үүнийг гаргах тусдаа цэг байгаа эсэхийг шалгаарай. том тээш эсвэл том ачаа - дээр дурдсантай төстэй ачаа тээшийг ихэвчлэн тусдаа тасалгаанд ачиж, тусад нь гараар буулгадаг. Хэрэв таны ачаа тэндээс олдохгүй бол
2. Ачаа тээшний бүртгэл эсвэл Lost & Found тоолуур руу очно уу. Тэнд та өөрийн ачаа тээшний талаархи дэлгэрэнгүй мэдээллийг агуулсан тусгай маягт бөглөх хэрэгтэй: зам, гадаад төрх, агуулгын товч жагсаалт, байнгын оршин суух газар, түр оршин суух хаягтай холбоо барих хаягууд. Мөн ачаа тээшний хяналтын үйлчилгээнд та дараах байдлаар ачаа тээшний хүснэгтийг харах магадлал өндөр байна.

Энэ ангиллын дагуу таны алга болсон ачаа тээшийг кодлох бөгөөд эдгээр хоёр чемодан ижил кодлогдсон байх болно.

Тиймээс тайлбарт нэмэлт дэлгэрэнгүй мэдээлэл нэмж оруулахаас гадна агуулгын заалтыг алгасаж болохгүй. Дүрмээр бол, та эхлээд ачаа тээшний саатлын тайланг бөглөхдөө гадна талд таних тэмдэг байхгүй бол таны цүнхийг таньж болох хэд хэдэн агуулгыг зааж өгөхийг хүсэх бөгөөд цүнхийг нээх шаардлагатай (хэрэв бол). уут нээгдсэн бол та энэ талаар мэдэгдэл өгөх болно). Муу жишээ: футболк / ном / нойтон салфетка, сайн жишээ: тод улаан бикини / Малевичийн хуулбаруудын каталог / эвхдэг төмөр. Өргөдлийг бөглөсний дараа ачаа тээшний үйлчилгээний ажилтан танд XXXYY11111 форматтай дугаар өгөх бөгөөд XXX нь нисэх онгоцны буудлын ирэх код, YY нь ирэх агаарын тээврийн код + өргөдлийн серийн дугаарын 5 оронтой: жишээлбэл, JFKLH12345, хэрэв Та Lufthansa-тай хамт Нью-Йорк дахь Кеннеди нисэх онгоцны буудал руу ниссэн. Энэ дугаарыг санаарай эсвэл бичнэ үү - энэ нь ирээдүйн програмуудад таны өргөдлийг олох хамгийн хялбар арга байх болно.
Үүнтэй ижил дугаарыг ашиглан хайлтын статусыг ӨӨРӨӨ шалгах боломжтой (ямар нэг шалтгааны улмаас холбоос алга болно: хэрэв энэ нь танд тохирохгүй бол google World Tracer Online ба шууд утгаараа Worldtracer.aero вэб сайт дээрх Ачаа тээшний бүртгэл гэсэн гарчигтай хоёр дахь холбоос нь танд хэрэгтэй зүйл юм), учир нь алдагдсан&олон олсон. ихэвчлэн маш хэцүү байдаг
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 еврогоос илүү мөнгө авахгүй.

PHP хөгжүүлэгчид concurrency-ийг ховор ашигладаг бололтой. Синхрон кодын энгийн байдлын талаар би ярихгүй; нэг урсгалтай програмчлал нь мэдээжийн хэрэг илүү энгийн бөгөөд ойлгомжтой боловч заримдаа параллелизмыг бага зэрэг ашиглах нь гүйцэтгэлийг мэдэгдэхүйц нэмэгдүүлэх болно.

Энэ нийтлэлд бид pthreads өргөтгөлийг ашиглан PHP хэл дээр хэрхэн multithreading хийж болох талаар авч үзэх болно. Үүний тулд PHP 7.x-ийн ZTS (Zend Thread Safety) хувилбарыг суулгасан pthreads v3 өргөтгөлийн хамт суулгасан байх шаардлагатай. (Бичиж байх үед PHP 7.1 дээр хэрэглэгчид pthreads репозитор дахь мастер салбараас суулгах шаардлагатай болно - гуравдагч талын өргөтгөлийг үзнэ үү.)

Жижигхэн тодруулга: pthreads v2 нь PHP 5.x-д зориулагдсан бөгөөд цаашид дэмжигдэхгүй, pthreads v3 нь PHP 7.x-д зориулагдсан бөгөөд идэвхтэй хөгжиж байна.

Ийм ухралт хийсний дараа шууд асуудал руугаа орцгооё!

Нэг удаагийн даалгаврыг боловсруулж байна

Заримдаа та нэг удаагийн даалгаврыг олон урсгалтай аргаар (жишээ нь, зарим I/O-тэй холбоотой ажлыг гүйцэтгэх) боловсруулахыг хүсдэг. Ийм тохиолдолд та Thread классыг ашиглан шинэ хэлхээ үүсгэж, тусдаа thread дээр зарим боловсруулалт хийж болно.

Жишээлбэл:

$даалгавар = шинэ анги нь Thread-ыг өргөтгөх (хувийн $response; нийтийн функцийг ажиллуулах() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $ контент, $ таарч байна); $ this->response = $ matches; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) "Google"

Энд ажиллуулах арга бол бидний боловсруулалт бөгөөд үүнийг шинэ урсгал дотор гүйцэтгэх болно. Thread::start дуудагдах үед шинэ урсгал үүсч, run method дуудагдана. Дараа нь бид Thread::join гэж дуудаж, хүүхэд хэлхээг үндсэн хэлхээнд буцааж нэгтгэх бөгөөд энэ нь хүүхэд хэлхээг гүйцэтгэж дуусах хүртэл хаах болно. Энэ нь үр дүнг хэвлэхийг оролдохоос өмнө ($task->response-д хадгалагдсан) даалгаврыг гүйцэтгэж дуусахыг баталгаажуулдаг.

Урсгалын логиктой холбоотой нэмэлт үүрэг хариуцлагыг (гүйлтийн аргыг тодорхойлох үүрэг гэх мэт) ангиллаар бохирдуулах нь тийм ч таатай биш байж болох юм. Бид Threaded ангиас удамшсанаар ийм ангиудыг ялгаж чадна. Дараа нь тэдгээрийг өөр thread дотор ажиллуулж болно:

Ангийн даалгавар нь Threaded ( нийтийн $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $match); $ 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 өргөтгөлийн санал болгож буй ангийн шатлалыг харцгаая:

Threaded (Traversable, Collectable-ийг хэрэгжүүлдэг) Thread Worker Volatile Pool

Бид Thread болон Threaded ангиудын үндсийг аль хэдийн үзэж, сурсан, одоо бусад гурвыг (Ажилчин, Дэгдэмхий, Усан сан) харцгаая.

Threads дахин ашиглах

Зэрэгцүүлэх шаардлагатай ажил бүрийн хувьд шинэ хэлхээ эхлүүлэх нь нэлээд үнэтэй байдаг. Учир нь PHP дотор олон урсгалтай болгохын тулд нийтлэг-юу ч биш архитектурыг pthread-д хэрэгжүүлэх ёстой. Энэ нь PHP орчуулагчийн одоогийн жишээний гүйцэтгэх контекстийг бүхэлд нь (анги, интерфейс, шинж чанар, функц бүрийг оруулаад) үүсгэсэн хэлхээ бүрд хуулах ёстой гэсэн үг юм. Энэ нь гүйцэтгэлд мэдэгдэхүйц нөлөө үзүүлдэг тул аль болох урсгалыг дахин ашиглах хэрэгтэй. Threads-ийг хоёр аргаар дахин ашиглаж болно: Workers эсвэл Pools ашиглах.

Worker анги нь өөр thread дотор хэд хэдэн ажлыг синхроноор гүйцэтгэхэд ашиглагддаг. Энэ нь шинэ Worker жишээ үүсгээд (шинэ хэлхээ үүсгэдэг), дараа нь тухайн тусдаа урсгалын стек рүү даалгавруудыг түлхэж (Worker::stack ашиглан) хийдэг.

Энд жижиг жишээ байна:

Ангийн даалгавар нь Threaded ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $ажилчин = шинэ Ажилчин(); $ажилчин->эхлэх(); for ($i = 0; $i stack(new Task($i)); ) while ($worker->collect()); $worker->sutdown();

Дээрх жишээн дээр шинэ $worker объектын 15 даалгаврыг Worker::stack аргаар стек рүү түлхэж, дараа нь түлхэсэн дарааллаар нь боловсруулдаг. Дээр үзүүлсэн шиг Worker::collect аргыг даалгавруудыг гүйцэтгэж дуусмагц цэвэрлэхэд ашигладаг. Үүний тусламжтайгаар бид Worker::shutdown гэж дуудахаас өмнө стек дээрх бүх ажлуудыг хийж дуусгах хүртэл хэсэг хугацааны давталт дотор үндсэн утсыг блоклодог. Ажилтныг эрт дуусгах нь (жишээ нь дуусгах ажил хэвээр байгаа ч) бүх ажлуудыг дуусгах хүртэл үндсэн хэлхээг блоклосон хэвээр байх болно, зүгээр л даалгаврууд нь хог хаягдлыг цуглуулахгүй (энэ нь санах ойн алдагдлыг илтгэнэ).

Worker анги нь ажлын стектэй холбоотой өөр хэд хэдэн аргуудыг өгдөг бөгөөд үүнд хамгийн сүүлийн давхарласан даалгаврыг устгах Worker::unstack, гүйцэтгэлийн стек дэх даалгаврын тоог авах Worker::getStacked орно. Ажилчдын стек нь зөвхөн гүйцэтгэх ёстой ажлуудыг агуулдаг. Стек дээрх ажил дууссаны дараа түүнийг салгаж, тусдаа (дотоод) хогийг цуглуулах стек дээр байрлуулна (Ажилчин:: цуглуулах аргыг ашиглан).

Thread-ийг олон даалгаварт дахин ашиглах өөр нэг арга бол thread-ийн санг ашиглах явдал юм (Pool классаар). Thread pool нь даалгавруудыг гүйцэтгэхийн тулд ажилчдын бүлгийг ашигладаг нэгэн зэрэг, цөөрөм үүсгэх үед зэрэгцээ байдлын коэффициентийг (үүнтэй ажилладаг усан сангийн хэлхээний тоо) тохируулдаг.

Ажилчдын нөөцийг ашиглахын тулд дээрх жишээг тохируулъя.

Ангийн даалгавар нь Threaded ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $pool = шинэ Pool(4); for ($i = 0; $i submit(new Task($i)); ) while ($pool->collect()); $pool->sutdown();

Усан санг ашиглахдаа ажилчдаас ялгаатай хэд хэдэн мэдэгдэхүйц ялгаа байдаг. Нэгдүгээрт, усан санг гараар эхлүүлэх шаардлагагүй, ажил бэлэн болмогцоо гүйцэтгэж эхэлдэг. Хоёрдугаарт, бид илгээхусан сан руу хийх даалгавар, биш тэдгээрийг овоолон дээр тавь. Нэмж дурдахад, Pool анги нь Threaded-аас өвлөгддөггүй тул бусад урсгал руу (Ажилчин-аас ялгаатай) дамжуулах боломжгүй.

Ажилчид болон усан сангууд даалгавраа хийж дуусмагц цэвэрлэж, өөрсдөө гараар дуусгах нь сайн туршлага юм. Thread класс ашиглан үүсгэсэн Threadууд нь мөн эх thread-д хавсаргасан байх ёстой.

pthreads ба (im)mutability

Бидний ярих сүүлийн анги бол pthreads v3-ийн шинэ нэмэлт болох Volatile юм. Үл хувирах чадвар нь 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->) өгөгдөл); // 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 шинж чанарыг өөрчлөх (мөн тохируулаагүй()) боломжийг олгохын тулд эх Threaded ангиасаа тогтоосон өөрчлөгдөшгүй байдлыг дарж байгааг харж болно.

Хувьсах чадвар ба дэгдэмхий анги болох массивуудын сэдвийг хамрах өөр нэг сэдэв бий. Pthread-д Threaded классын шинж чанарт массивууд хуваарилагдах үед автоматаар дэгдэмхий объектууд руу шилждэг. Учир нь олон PHP контекстийн массивыг удирдах нь зүгээр л аюулгүй биш юм.

Зарим зүйлийг илүү сайн ойлгохын тулд жишээг дахин харцгаая.

$ массив =; $даалгавар = шинэ анги($массив) Thread-ыг сунгана (хувийн $өгөгдөл; нийтийн функц __construct(массив $массив) ( $this->data = $array; ) public function run() ( $this->data = 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($дата->поп()); var_dump($data->shift()); var_dump($ өгөгдөл); /* Гаралт: object(class@nonymous)#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 = new class extensions Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $counter->start(); for ($i = 0; $i i; ) $counter->join(); var_dump($counter->i); // 10-аас 20 хүртэлх тоог хэвлэнэ

Синхрончлолыг ашиглахгүйгээр гаралт нь тодорхойлогч биш юм. Олон урсгалууд нь хяналтгүй хандалтгүйгээр нэг хувьсагч руу бичдэг бөгөөд энэ нь шинэчлэлтүүд устах болно гэсэн үг юм.

Хугацаа нэмснээр 20-ийн зөв гаралтыг авахын тулд үүнийг засъя:

$counter = new class extensions Thread ( public $i = 0; public function run() ( $this->синхрончлогдсон(функц () ( for ($i = 0; $i i; ) ); ) ); $counter->start(); $counter->синхрончлогдсон(функц ($тоолуур) ( for ($i = 0; $i i; ) ), $counter); $counter->нэгдэх(); 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->синхрончлогдсон(функц ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // нөгөө нь эхэлж эхлэхийг хүлээнэ үү ) ($i = 10; $i notify(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->нэгдэх(); /* Гаралт: 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 хэрхэн ашиглагдаж болохыг судалж эхлэх боломжтой! Энэ бол бидний дараагийн нийтлэлийн сэдэв байх болно.

Хэрэв та дараагийн бичлэгийн орчуулгыг сонирхож байгаа бол надад мэдэгдээрэй: нийгмийн сүлжээн дэх сэтгэгдэл. сүлжээнд саналаа өгч, нийтлэлийг хамтран ажиллагсад, найзуудтайгаа хуваалцаарай.

Урсгалтай хэлэлцүүлэг

А сэдэвчилсэн хэлэлцүүлэгЭнэ нь цахим хэлэлцүүлэг (и-мэйл, цахим шуудангийн жагсаалт, мэдээллийн самбар, мэдээний бүлэг эсвэл интернет форум гэх мэт) бөгөөд програм хангамж нь мессежийг нүдээр бүлэглэх замаар хэрэглэгчдэд тусалдаг. Мессежүүд нь ихэвчлэн сэдвийн дагуу шаталсан байдлаар бүлэглэгддэг. Ийм байдлаар бүлэглэсэн мессежийн багцыг a гэж нэрлэдэг сэдвийн сэдэвэсвэл зүгээр л "утас". Хэлэлцүүлгийн форум, и-мэйл клиент эсвэл мэдээний үйлчлүүлэгч нь ижил сэдвээр мессежүүдийг нэгтгэж, уншихад хялбар болгодог бол "урсгалтай сэдвүүд" гэж нэрлэдэг. Түүнээс гадна урсгалтай хэлэлцүүлэг нь ихэвчлэн тухайн сэдвийн хүрээнд тодорхой нийтлэлд хариу бичих боломжийг хэрэглэгчдэд олгодог. Үүний үр дүнд сэдвийн сэдвийн доторх хэлэлцүүлгийн шатлал үүсч болно. Төрөл бүрийн програм хангамж нь энэ шатлалыг юун дээр харуулахыг зөвшөөрч болно. Threaded Mode гэж нэрлэдэг. (Хэн хэнд тусгайлан хариулснаас үл хамааран бүх нийтлэлийг огнооны дарааллаар харуулдаг Шугаман горимын хувилбар юм.)

Давуу тал

Шаталсан үзэл бодлын давуу тал нь уншигчдад харилцан ярианы ерөнхий бүтцийг, ялангуяа хэн хэнд хариулж байгааг хурдан ойлгох боломжийг олгодог. Мэдээллийн бүлгүүд гэх мэт уртасгасан яриа, мэтгэлцээний нөхцөлд энэ нь хамгийн ашигтай байдаг: үнэхээр нарийн төвөгтэй мэтгэлцээний хувьд ямар нэгэн шаталсан хэлхээний системгүйгээр аргументыг дагах нь хурдан боломжгүй болдог.

Өөр нэг давуу тал нь шаталсан урсгалтай систем дэх нийгэмлэгийг илүү нарийн үнэлэх явдал юм. Тодорхой нийтлэлд хариу өгөх шаардлагатай байдаг тул тодорхой хүмүүст бас хариу өгдөг. Иймээс урсгалтай харилцан яриа нь тухайн хүний ​​тодорхой үзэл бодол, зан чанарт зохиолчийг чиглүүлэх хандлагатай байдаг. Энэ нь хамгийн сүүлийн тайлбарыг ерөнхий санд оруулсан форумд бага тохиолддог.

Сул тал

Хавтгай утастай харьцуулахад шаталсан хэлхээний сул тал нь хүндрэлийн түвшин нэмэгдэж байгаа тул ийм үзэл бодол нь хэрэглэгчдийн тав тух, боловсронгуй байдлыг нэмэгдүүлэхийг шаарддаг. Тиймээс Usenet, CIX эсвэл Slashdot зэрэг хамгийн эртний ба/эсвэл хамгийн боловсронгуй онлайн нийгэмлэгүүдэд түүний хэрэглээ хамгийн их байсан нь гайхах зүйл биш юм. Вэб чат болон сэтгэгдлийн системүүд нь харьцангуй залуу бөгөөд илүү өргөн хүрээний үзэгчдэд нээлттэй байдаг тул шаталсан хэлхээ нь саяхан ийм талбарт түгээмэл болж байна.

Модны шатлал тогтоох нь сэдвийн хүрээнд хэлэлцүүлгийг хэсэгчлэн тараах хандлагатай байдаг: өмнөх хэд хэдэн нийтлэлд хариулах эсвэл нэгтгэн дүгнэсэн мессеж нийтлэх боломжгүй болсон. Харин өмнөх нийтлэл болгонд тус тусад нь хариу өгөх ёстой. Энэ нь шаталсан хэлхээг ашигладаг форумд илүү сөргөлдөөнтэй мэтгэлцээнд хүргэдэг гэдэгтэй маргах аргагүй юм. Гэсэн хэдий ч энэ нь үнэн боловч хэрэв хүссэн нийтлэлд өгсөн хариултын тооноос болж шууд урсгалтай хариулт өгөх боломжгүй болсон бол хэрэглэгчид харилцан яриагаа хэвийн үргэлжлүүлэхийн тулд хариу өгч буй хүнийхээ ишлэлийг ихэвчлэн ашигладаг болсон. жигд Урсгал дамжуулах хязгаарт хүрсэн тохиолдолд ихэнх мессежийн самбарын нийгэмлэг үүнийг зөвлөж байна.

Нээлттэй утас

Нээлттэй хэлхээ гэдэг нь уншигчид өөрсдийн сонгосон сэдвээр санал бодлоо илэрхийлж, ярилцах боломжтой блог нийтлэлийг хэлнэ. Тэд ихэвчлэн их хэмжээний урсгалтай алдартай блог дээр илүү хэрэгтэй байдаг; Эдгээрийг ихэвчлэн блогын зохиогч нь нийтлэх сэдэвгүй эсвэл нийтлэх нь завсарласан үед ашиглагддаг.

Нээлттэй сэдвүүдийг блогын үндсэн хуудсууд дээрх нэгэн хэвийн нийтлэлийг задлахад ашигладаг. Агуулга чиглэсэн нийтлэлүүд дээр сэтгэгдэл хуримтлагдаж болно; Тиймээс зохиогчид нээлттэй хэлхээсийг ашигладаг тул хуудсыг ачаалах хугацааг удаашруулахгүй.

Жишээ

*Yahoo! Бүлгүүд [ http://groups.yahoo.com/], MSN бүлгүүд [ http://groups.msn.com/] болон Slashdot [ http://www.slashdot.com/] бүгд сэдэвчилсэн хэлэлцүүлгийг багтаасан вэб дээр суурилсан форумыг санал болгодог.

Мөн үзнэ үү

*Эрдэм шинжилгээний Скайрайт
* Блог хөтлөх нэр томъёоны жагсаалт

Лавлагаа

*Дартмут. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Онлайн хэлэлцүүлэг хийх" ]
*Волси, Т.Дэвэр, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Цахим орон зай дахь уран зохиолын хэлэлцүүлэг: Залуу өсвөр үеийнхэн номын тухай ярихдаа сэдэвчилсэн хэлэлцүүлгийн бүлгүүдийг ашиглаж байна.] . "Онлайнаар унших", 7(4), 2004 оны 1/2-р сар. 2007 оны 12-р сарын 30-нд авсан.

Викимедиа сан. 2010 он.

  • Леон Пау
  • Барх Азум

Бусад толь бичгүүдийг харна уу:

    Интернет форум- phpBB Интернэт Форумын программ хангамжийн багц, форумын хамгийн алдартай багцуудын нэг... Wikipedia

    1990-ээд оны виртуал сургалтын орчны түүх- Виртуал сургалтын орчны түүхэнд 1990-ээд он бол хамгийн түрүүнд боломжийн үнэтэй компьютер болон интернет бий болсонтой холбоотой өсөлтийн үе байсан.1990-1990* Formal Systems Inc. АНУ, НЖ, Принстон хот DOS-д суурилсан үнэлгээг нэвтрүүлж байна… … Wikipedia

    Кофе- Хамтран ажиллах Нүүр тулсан Боловсролын Орчны Хөгжүүлэгч(үүд) LEAD консорциум Тогтвортой хувилбар 5.0 / 2010 оны 6-р сар Үйлдлийн систем Хөндлөн платформ … Wikipedia

    Харилцан ярианы хэлхээ- Энэ нь олон имэйл үйлчлүүлэгчид, мэдээллийн самбар, мэдээний бүлгүүд эсвэл интернет форумд ашигладаг функц бөгөөд программ хангамж нь мессежийг нүдээр бүлэглэх замаар хэрэглэгчдэд тусалдаг. Мессежүүд нь ихэвчлэн сэдвийн дагуу шаталсан байдлаар бүлэглэгддэг. Бүлэглэсэн мессежийн багц... ... Википедиа

    Slashdot- Дэлгэрэнгүй хүмүүст зориулсан Slashdot.org сайтын үндсэн хуудасны slashdot.org уриа мэдээний дэлгэцийн агшин. Чухал зүйл... Википедиа

    MediaWiki- нэрийн орон зайг энд дахин чиглүүлдэг. Википедиа дээрх MediaWiki нэрийн талбарын талаар тусламж авахыг хүсвэл Help:MediaWiki нэрийн орон зайг үзнэ үү. Википедиагийн нэрийн орон зайн талаарх ерөнхий мэдээллийг Википедиа:Нэрийн орон зайнаас үзнэ үү. Ярилцах хуудас болон MediaWiki ярианы хуудсыг эндээс дахин чиглүүлнэ. Википедиагийн хувьд... ...

    Компьютерийн харилцаа холбоо- Бусад хэрэглээг CMC (тодорхойлолт) -аас үзнэ үү. Компьютерийн зуучлалын харилцаа холбоо (CMC) нь хоёр ба түүнээс дээш сүлжээнд холбогдсон компьютер ашиглах замаар хийгддэг аливаа харилцааны гүйлгээ гэж тодорхойлогддог. Энэ нэр томъёо нь уламжлал ёсоор эдгээрийг хэлдэг байсан ч… … Википедиа

    Вики програм хангамжийн харьцуулалт- Дараах хүснэгтэд хэд хэдэн вики программ хангамжийн ерөнхий болон техникийн мэдээллийг харьцуулсан болно. Агуулга 1 Ерөнхий мэдээлэл 2 Зорилтот үзэгчид 3 Онцлогууд 1 4 Онцлогууд 2 ... Wikipedia

    Эрдэм шинжилгээний Skywriting- танин мэдэхүйн эрдэмтэн Стиван Харнадын зохиосон нэр томьёо нь мэдээллийн бүлэг, цахим шуудангийн жагсаалт, гипермэйл, netnews эсвэл интернет форум гэх мэт олон цахим шуудан болон сэдэвтэй вэб архивын хослолыг тайлбарлаж, огноогоор нь холбосон, эрэмбэлсэн, ... … Wikipedia

    Хамтарсан шийдвэр гаргах программ хангамж- Хамтарсан шийдвэр гаргах (CDM) программ хангамж нь хамтын шийдвэрүүдийг цаг тухайд нь гаргахад шаардагдах чиг үүрэг, онцлогуудыг зохицуулж, холбогдох бүх оролцогч талуудыг үйл явцад оролцох боломжийг олгодог програм хангамжийн хэрэглүүр буюу модуль юм. ... ... Википедиа

Заримдаа хэд хэдэн үйлдлийг нэгэн зэрэг хийх шаардлагатай болдог, жишээлбэл, нэг мэдээллийн сангийн хүснэгтийн өөрчлөлтийг шалгаж, нөгөөд нь өөрчлөлт оруулах. Түүнээс гадна, хэрэв үйлдлүүдийн аль нэг нь (жишээлбэл, өөрчлөлтийг шалгах) маш их цаг зарцуулдаг бол дараалсан гүйцэтгэл нь нөөцийн тэнцвэрийг хангахгүй байх нь ойлгомжтой.

Энэ төрлийн асуудлыг шийдэхийн тулд програмчлалын олон урсгалыг ашигладаг - үйлдэл бүрийг хуваарилсан нөөц бүхий тусдаа хэлхээнд байрлуулж, дотор нь ажилладаг. Энэ аргын тусламжтайгаар бүх ажлыг тусад нь, бие даан гүйцэтгэх болно.

Хэдийгээр PHP нь олон урсгалыг дэмждэггүй ч түүнийг дуурайх хэд хэдэн аргууд байдаг бөгөөд тэдгээрийг доор авч үзэх болно.

1. Скриптийн хэд хэдэн хуулбарыг ажиллуулах - үйлдэл бүрт нэг хуулбар

//woman.php if (!isset($_GET["thread"])) ( system("wget ​​http://localhost/woman.php?thread=make_me_happy"); system("wget ​​http: //localhost/ woman.php?thread=me_rich"); ) elseif ($_GET["thread"] == "намайг_баярлуулах") (түүнийг_баярлуул(); ) elseif ($_GET["thread"] == "намайг_баяжуулах" ) (өөр_нэг_ол( ); )

Бид энэ скриптийг ямар ч параметргүйгээр ажиллуулах үед энэ нь шаардлагатай функцүүдийн гүйцэтгэлийг эхлүүлдэг үйлдлийн ID ("thread=make_me_happy" ба "thread=make_me_rich") бүхий хоёр хуулбарыг автоматаар ажиллуулдаг.

Ингэснээр бид хүссэн үр дүндээ хүрдэг - хоёр үйлдлийг нэгэн зэрэг гүйцэтгэдэг - гэхдээ энэ нь мэдээжийн хэрэг олон урсгалтай биш, зүгээр л нэгэн зэрэг ажлыг гүйцэтгэх таяг юм.

2. Жедигийн зам - PCNTL өргөтгөл ашиглан

PCNTL нь процессуудтай бүрэн ажиллах боломжийг олгодог өргөтгөл юм. Удирдлагаас гадна энэ нь мессеж илгээх, статусыг шалгах, тэргүүлэх чиглэлийг тохируулахыг дэмждэг. PCNTL ашигласан өмнөх скрипт иймэрхүү харагдаж байна:

$ pid = pcntl_fork(); if ($pid == 0) ( make_her_happy(); ) elseif ($pid > 0) ( $pid2 = pcntl_fork(); if ($pid2 == 0) ( өөр_нэг_ол(); ) )

Энэ нь нэлээд ойлгомжгүй харагдаж байна, үүнийг мөр мөрөөр нь авч үзье.

Эхний мөрөнд бид одоогийн процессыг "сэрээ" (сэрээ нь бүх хувьсагчийн утгыг хадгалахын зэрэгцээ процессыг хуулж) зэрэгцээ ажиллаж байгаа хоёр процесст (одоогийн ба хүүхэд) хуваадаг.

Бид одоогоор хүүхэд эсвэл эх процесст байгаа эсэхийг ойлгохын тулд pcntl_fork функц нь хүүхдэд 0, эхийн хувьд процессын ID-г буцаана. Тиймээс, хоёр дахь мөрөнд бид $ pid-ийг харна, хэрэв тэг бол бид хүүхдийн процесст байна - бид функцийг гүйцэтгэж байна, үгүй ​​бол бид эх (мөр 4) -д байна, дараа нь бид өөр процесс үүсгэж, Үүнтэй адилаар даалгавраа гүйцэтгэнэ.

Скриптийг гүйцэтгэх үйл явц:

Тиймээс скрипт нь түүний хуулбар бөгөөд ижил утгатай ижил хувьсагчдыг агуулсан өөр 2 хүүхэд процесс үүсгэдэг. Мөн pcntl_fork функцээр буцаасан танигчийг ашиглан бид аль урсгалд байгаа болохыг олж мэдээд шаардлагатай үйлдлүүдийг гүйцэтгэдэг.



Холбогдох хэвлэлүүд