Utanmaz müzakirə mövzusu php. PHP-də çoxillik hesablama: pthreads

Yivli müzakirə

A mövzulu müzakirə proqram təminatının mesajları vizual olaraq qruplaşdırmaqla istifadəçiyə yardım etdiyi elektron müzakirədir (məsələn, e-poçt, e-poçt siyahısı, bülleten lövhəsi, xəbər qrupu və ya İnternet forumu vasitəsilə). Mesajlar adətən mövzuya görə vizual olaraq iyerarxiyada qruplaşdırılır. Bu şəkildə qruplaşdırılmış mesajlar toplusu a adlanır mövzu mövzusu və ya sadəcə "iplik". Müzakirə forumu, e-poçt müştərisi və ya xəbər müştərisi eyni mövzuya aid mesajları bu şəkildə asan oxumaq üçün bir yerdə qruplaşdırarsa, "məvzuları" olduğu deyilir. Bundan əlavə, yivli müzakirələr adətən istifadəçilərə mövzunun mövzu daxilində xüsusi göndərişlərə cavab verməyə imkan verir. Nəticədə mövzu daxilində müzakirələr iyerarxiyası ola bilər. Müxtəlif proqram növləri bu iyerarxiyanın hansı mövzuda göstərilməsinə imkan verə bilər. Yivli rejim adlanır. (Alternativ kimin konkret kimə cavab verməsindən asılı olmayaraq, adətən bütün yazıları tarix sırasına görə göstərən Xətti Rejimdir.)

Üstünlüklər

İerarxik baxışların üstünlüyü ondan ibarətdir ki, onlar oxucuya söhbətin ümumi strukturunu tez bir zamanda qiymətləndirməyə imkan verir: xüsusilə kimin kimə cavab verdiyini. Beləliklə, xəbər qrupları kimi geniş söhbətlər və ya debatlar zamanı ən faydalıdır: həqiqətən də, həqiqətən mürəkkəb müzakirələr üçün, bir növ iyerarxik sistem olmadan arqumenti izləmək tez mümkünsüz olur.

Digər fayda, iyerarxik yivli sistemlərdə cəmiyyətin daha incə qiymətləndirilməsidir. Müəyyən yazılara cavab verilməli olduğu kimi, konkret şəxslərə də cavab verilir. Buna görə də yivli söhbətlər yazıçının diqqətini cavablandırılan şəxsin spesifik baxışlarına və şəxsiyyətinə yönəldir. Bu, ən son şərhin ümumi hovuza daxil edildiyi forumlarda daha az baş verir.

Mənfi cəhətləri

İyerarxik yivlərin düz yivləmə ilə müqayisədə dezavantajı artan mürəkkəblik səviyyəsidir və buna görə də belə bir görünüş istifadəçilərdən yüksək səviyyəli rahatlıq və mürəkkəblik tələb edir. Buna görə də təəccüblü deyil ki, onun istifadəsinin Usenet, CIX və ya Slashdot kimi ən qədim və/yaxud ən mürəkkəb onlayn icmalarda ən ağır olması təəccüblü deyil. Veb söhbət və şərh sistemləri, müqayisədə, daha gəncdir və daha geniş auditoriyaya açıqdır və beləliklə, iyerarxik keçid yalnız bu yaxınlarda belə arenalarda adi hala çevrilir.

Ağac iyerarxiyasının tətbiqi həm də mövzu daxilində müzakirələrin parçalanmasına səbəb olur: bir neçə fərqli əvvəlki yazıya cavab verən və ya ümumiləşdirən mesaj göndərmək artıq mümkün olmur. Bunun əvəzinə, hər bir əvvəlki yazıya fərdi olaraq cavab verilməlidir. Bunun iyerarxik ipdən istifadə edən forumlarda daha ziddiyyətli müzakirə tərzinə gətirib çıxardığı mübahisəlidir. Bununla belə, doğru olsa da, arzu olunan posta verilən cavabların həcminə görə birbaşa mövzulu cavab artıq mümkün deyilsə, istifadəçilər indi söhbəti davam etdirmək və davam etdirmək üçün tez-tez cavab verdikləri şəxsin sitatlarından istifadə edirlər. rəvan Bu, mesaj lövhəsinin bir çox icmaları tərəfindən mövzunun başqa hərtərəfli limitə çatması halında tövsiyə olunur.

Açıq mövzu

Açıq mövzu oxucuların seçdikləri hər hansı mövzunu şərh edə və müzakirə edə biləcəyi bir blog yazısına aiddir. Onlar adətən böyük miqdarda trafikə malik məşhur bloqlarda daha faydalıdır; Onlar tez-tez bloqun müəllifinin yazmaq üçün mövzusu olmadıqda və ya yerləşdirmədə sakitlik olduqda istifadə olunur.

Açıq mövzular bloqların əsas səhifələrindəki yazıların monotonluğunu aradan qaldırmaq üçün də istifadə olunur. Şərhlər məzmun yönümlü yazılarda yarana bilər; buna görə də, müəlliflər açıq mövzulardan istifadə edirlər ki, səhifə yükləmə vaxtları yavaşlamasın.

Nümunələr

*Yahoo! Qruplar [ http://groups.yahoo.com/], MSN Qrupları [ http://groups.msn.com/] və Slashdot [ http://www.slashdot.com/] hamısı yivli müzakirələri əks etdirən veb əsaslı forumlar təklif edir.

Həmçinin bax

*Elmi Skywriting
* Bloq şərtlərinin siyahısı

İstinadlar

*Dartmut. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Onlayn müzakirə aparmaq" ]
*Wolsey, T. DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Kiberməkanda ədəbiyyat müzakirəsi: Gənc yeniyetmələr kitablar haqqında danışmaq üçün mövzulu müzakirə qruplarından istifadə edir.]. "Onlayn oxumaq", 7(4), yanvar/fevral 2004. Alındı ​​30 dekabr 2007

Wikimedia Fondu. 2010.

  • Leon Powe
  • Barh Azoum

Digər lüğətlərə baxın:

    İnternet forumu- Ən məşhur forum paketlərindən biri olan phpBB İnternet Forumu proqram paketi... Wikipedia

    Virtual öyrənmə mühitlərinin tarixi 1990-cı illər- Virtual öyrənmə mühitlərinin tarixində 1990-cı illər, ilk növbədə, əlverişli kompüterin və İnternetin meydana çıxması ilə bağlı inkişaf dövrü idi.1990-cı illər 1990* Formal Systems Inc. Princeton, NJ, ABŞ DOS əsaslı Qiymətləndirmə təqdim edir… … Vikipediya

    QƏHƏ- Birgə Üz-üzə Təhsil Mühiti Tərtibatçı(lar)ı LEAD konsorsiumu Stabil buraxılış 5.0 / İyun 2010 Əməliyyat sistemi Çarpaz platforma … Wikipedia

    Söhbət ipliyi- bir çox e-poçt müştəriləri, bülleten lövhələri, xəbər qrupları və ya İnternet forumları tərəfindən istifadə edilən xüsusiyyətdir ki, proqram təminatı mesajları vizual olaraq qruplaşdırmaqla istifadəçiyə kömək edir. Mesajlar adətən mövzuya görə vizual olaraq iyerarxiyada qruplaşdırılır. Qruplaşdırılmış mesajlar toplusu... ... Vikipediya

    Slashdot- Nerdlər üçün Slashdot.org əsas səhifəsinin URL slashdot.org Sloqan Xəbərinin ekran görüntüsü. Əhəmiyyətli şeylər... Vikipediya

    MediaViki- ad sahəsi burada yönləndirilir. Vikipediyada MediaWiki ad sahəsi ilə bağlı yardım üçün Yardım:MediaWiki ad sahəsinə baxın. Vikipediya ad məkanları haqqında ümumi məlumat üçün Vikipediya:Ad sahəsinə baxın. Müzakirə səhifəsi və MediaWiki müzakirə səhifəsi bura yönləndirilir. Üçün... ... Vikipediya

    Kompüter vasitəsilə əlaqə- Digər istifadələr üçün CMC-yə baxın (anlamsızlıq). Kompüter vasitəçiliyi rabitəsi (CMC) iki və ya daha çox şəbəkəyə qoşulmuş kompüterlərin istifadəsi ilə baş verən hər hansı bir kommunikativ əməliyyat kimi müəyyən edilir. Termin ənənəvi olaraq həmin… … Vikipediyaya aiddir

    Wiki proqram təminatının müqayisəsi- Aşağıdakı cədvəllər bir sıra viki proqram paketləri üçün ümumi və texniki məlumatları müqayisə edir. Məzmun 1 Ümumi məlumat 2 Hədəf auditoriyası 3 Xüsusiyyətlər 1 4 Xüsusiyyətlər 2 … Vikipediya

    Elmi Skywriting- koqnitiv alim Stevan Harnad tərəfindən hazırlanmış bir termindir və bir çox e-poçt və xəbər qrupu, elektron poçt siyahısı, hipermail, netnews və ya İnternet forumu kimi mövzu ilə əlaqəli veb arxivin birləşməsini təsvir edir, əlaqələndirilmiş və tarixə görə çeşidlənir,… … Wikipedia

    Birgə qərar qəbul etmə proqramı- Birgə qərarların qəbulu (CDM) proqramı bütün müvafiq maraqlı tərəflərin prosesdə iştirakına imkan verən, vaxtında kollektiv qərarlar qəbul etmək üçün tələb olunan funksiyaları və xüsusiyyətləri koordinasiya edən proqram təminatı tətbiqi və ya moduludur. The... ... Vikipediya

Diqqət! Bu məqalə ümidsizcə köhnəlib və ya indi müəllif tərəfindən heç bir məlumat faydası olmayan kimi qiymətləndirilir.

Açıq mənbə kodunun gözəlliyi onun açıq olmasıdır :)) Yəni. zəka/vaxt/istəyiniz varsa, proqramın necə işlədiyini dəqiq anlaya bilərsiniz. Belə kodun mənfi tərəfi lazımi tərtib edilmiş paketləri əldə etməyin çətinliyidir. Məsələn, PHP-ni Nix sistemləri üçün mənbə kimi, sonrakı tərtib/quraşdırma ilə yükləmək olar. Windows üçün hər şey artıq yığılıb, lakin çoxlu hazır ikili paketlər var! " ilə seçimlər iplik təhlükəsiz/yivsiz sap", VC6/VC9 və PHP-nin müxtəlif versiyaları. Məqalə vəziyyəti aydınlaşdırmaq üçün yaradılıb. O, müxtəlif mənbələrə, qismən də ingilis dilindən tərcüməyə əsaslanır. Hamısı ona görə ki, növbəti dəfə bunu bir daha anlamaq məcburiyyətində qalmayacağam - "nə mənası var!?"

Lazımdır PHP versiyası onun istifadə olunacağı veb server versiyasından asılıdır. Məsələn, Apache 1.3.x PHP 3.0.x versiyası ilə, Apache 2.x PHP 4.0 və daha yüksək versiyaları ilə işləyir. Ancaq bu, belə bir problem deyil, daha yeni stabil buraxılışlara və hosterdə nələrə diqqət yetirin.

Nə cür postskriptlər VC6, VC9, VC11? Windows üçün PHP mənbələri Visual Studio proqramında tərtib edilmişdir. VC9 VS 2008, VC11 - Visual Studio 2012-də tərtib edildikdə əldə edilir. Müvafiq olaraq, bütün bunların sizin üçün işləməsi üçün kompüterinizdə kitabxanalar quraşdırılmalıdır. Visual Studio üçün yenidən paylana bilən Visual C++ müvafiq il. Bu məsələ ilə bağlı bəzi açıqlamalar.

Bundan əlavə, əgər veb serveriniz apache.org saytından köhnə Apachedirsə, onda siz PHP-nin VC6 versiyasını yükləməlisiniz, onun tərtibi üçün Visual Studio 6 istifadə edilmişdirsə, PHP IIS üçün və ya daha yeni Apache ilə birlikdə işləyəcək , onda daha müasir bir şey toplaya bilərsiniz ;)

Mənim üçün seçimdə əsas maneə hosterdir. İndi PHP 5.5.4-ün stabil versiyası var, lakin onun hələ də 5.2.17 var!

İndi maraqlı hissə: " iplik təhlükəsiz və ya qeyri iplik təhlükəsiz?"
Məqalənin pulsuz tərcüməsi (Dominic Ryan, 27/09/2007)

Mən heç vaxt belə qırıq-qırıq ingilis dili görməmişdim:((Məqaləni tez tərcümə etmək istədim, lakin müəllifin yazdıqlarını başa düşməkdə çətinlik çəkirəm. “What-is-that” və mürəkkəb cümlələr arasında daimi keçidlər ümumiyyətlə Moskvanı diqqətdən kənarda qoyur. Rus dili eyni dərəcədə mürəkkəbdir ki, rus dilində bir şeyi necə düzgün adlandırmaq barədə kifayət qədər biliyim və təxəyyülüm yoxdur, adətən yalnız ingilis dilində yazılır%) Məsələn, mən heç vaxt “çox prosesli arxitektura” texniki konsepsiyasını görməmişəm. rusca, amma mənim mirvari "axın- təhlükəlidir" ümumiyyətlə sağlam düşüncə məsələsidir.Ümumiyyətlə, baş verənləri sizə çatdıracağam.

Aralarındakı fərq iplik təhlükəsizipsiz təhlükəsiz PHP ikili paketləri

PHP Windows-da ilk dəfə 20 oktyabr 2000-ci ildə PHP 3.0.17 ilə ortaya çıxdığı üçün onun ikili paketləri həmişə aşağıdakı kimi qurulmuşdur. iplik təhlükəsiz (TS). Səbəb belədir: Windows çox yivli arxitekturadan istifadə edir və Nix sistemləri çox prosesli arxitekturanı dəstəkləyir. Əgər PHP çox yivli əvəzinə çox prosesli CGI proqramı kimi tərtib edilibsə, onda onu IIS serverində Windows altında CGI modulu kimi istifadə etmək ciddi yavaşlamalara və CPU istifadəsinə gətirib çıxarır. Digər tərəfdən, siz PHP-ni IIS-ə ISAPI modulu kimi qoşa bilərsiniz ( çox yivli quruluş tələb olunur- təqribən. tərcüməçi). Sonra başqa bir problem yaranır: bəzi məşhur PHP uzantıları Unix/Linux nəzərə alınmaqla hazırlanmışdır, yəni. ISAPI modulu kimi IIS-ə qoşulmuş PHP-nin çökməsinə səbəb olan çoxprosesli arxitektura ilə. Bu. CGI yaradılması IIS-də PHP üçün ən stabil mühitdir və əsas çatışmazlığı olduqca yavaş olmasıdır. Hər sorğu olanda biz bütün PHP mühitini yaddaşdan yükləməli və boşaltmalıyıq.

O zaman IIS-də PHP performansını yaxşılaşdırmaq üçün bir neçə variant var idi. Birincisi, PHP skriptlərini diskdə və/yaxud yaddaşda qismən tərtib edilmiş vəziyyətdə saxlayan eAccelerator kimi proqramlarla opcode caching-dən istifadə etməkdir. Bu yanaşma skriptin icra müddətini əhəmiyyətli dərəcədə azaldır. Başqa bir seçim IIS-i rejimdə PHP-dən istifadə etmək üçün konfiqurasiya etmək idi FastCGI. Bu halda, PHP prosesi başa çatdıqdan sonra bağlanmadı, lakin növbəti PHP sorğusu ilə yeni tapşırıq aldı. Bundan əlavə, PHP CGI rejiminin bonusu olan sorğuların işlənməsini əhəmiyyətli dərəcədə sürətləndirməklə eyni vaxtda bir neçə PHP prosesini icra etmək mümkün oldu. Bununla belə, PHP genişləndirmələri ilə kiçik uyğunluq problemləri ola bilər. Bu, hələ də PHP-dən istifadə etməyin ən sürətli yoludur və IIS Aid PHP Quraşdırıcısı bunu etmək üçün konfiqurasiya edilmişdir.

İkili faylda toplanmışdır iplik təhlükəsiz rejimi (ipliksiz, NTS), sizə IIS-i (və Windows-dakı digər veb serverləri) PHP-dən güclü performans artımı ilə standart CGI interfeysi kimi istifadə etmək üçün konfiqurasiya etməyə imkan verir, çünki bu halda (belə bir quruluşda) PHP prosesinin mövzuların sinxronizasiyasını gözləməyə ehtiyac yoxdur. Standart CGI interfeysi kimi IIS-də "thread safe" və "non-thread safe" PHP ikili paketlərinin performansını müqayisə edərkən, performans artımı 40%-ə qədərdir, lakin FastCGI metodunda əməliyyat kodundan istifadə qədər sürətli deyil. . Və ən böyük problem odur ki, siz iplik üçün təhlükəsiz olanlarla birlikdə etibarlı şəkildə istifadə edə bilməzsiniz. Bu o deməkdir ki, siz eAccelerator kimi opcode keşləmə sistemlərini iplik təhlükəli ikili paketlər tərəfindən yaradılmış PHP mühitində istifadə edə bilməzsiniz (yazı zamanı düzgün olan bəyanat).

Əgər iplik üçün təhlükəsiz olmayan PHP, ip üçün təhlükəsiz mühitlə eyni sürətə konfiqurasiya edilə bilmirsə, onda niyə belə bir quruluşa ehtiyac var? FastCGI və Microsoft-un son bir neçə ildə bu sahədəki inkişaflarına qayıdaq. Kiçik yumşaq kodlayıcılar FastCGI-nin öz versiyasını yaratdılar ki, bu da sizə FastCGI rejimində iş parçacığı üçün təhlükəli PHP ikili faylları konfiqurasiya etməyə imkan verir, bu da performansı işıq sürətinə çatdırır :)

Məqalədən belə nəticəyə gəldim ki, əyləclər yalnız IIS veb serveri ilə istifadə edildikdə müşahidə olunur. Hər halda, Windows+Apache altında heç bir axmaq şey görmədim. Həm də deyir ki, NTS montajını aşırtmaq olar hər hansı web server, lakin mən belə bir Apache konfiqurasiyasını təsəvvür edə bilmirəm.

Bu yaxınlarda pthreads cəhd etdim və xoş təəccübləndim - bu, PHP-də çoxlu real mövzularla işləmək qabiliyyətini əlavə edən genişlənmədir. Təqlid yoxdur, sehr yoxdur, saxtakarlıq yoxdur - hər şey realdır.



Mən belə bir tapşırığı düşünürəm. Tez yerinə yetirilməli olan bir sıra tapşırıqlar var. PHP-də bu problemi həll etmək üçün başqa alətlər var, onlar burada qeyd olunmur, məqalə pthreads haqqındadır.



pthreads nədir

Hamısı budur! Yaxşı, demək olar ki, hər şey. Əslində, maraqlanan oxucunu narahat edə biləcək bir şey var. Bunların heç biri standart seçimlərlə tərtib edilmiş standart PHP-də işləmir. Çox iş parçacığından zövq almaq üçün PHP-də ZTS (Zend Thread Safety) aktiv olmalıdır.

PHP quraşdırma

Sonra, ZTS ilə PHP. ZTS (37.65 vs 265.05 saniyə) olmayan PHP ilə müqayisədə icra müddətindəki böyük fərqə fikir verməyin, mən PHP quraşdırmasını ümumiləşdirməyə çalışmadım. ZTS olmayan halda, məsələn, XDebug-u aktivləşdirmişəm.


Gördüyünüz kimi, 2 ipdən istifadə edərkən, proqramın icra sürəti xətti kod vəziyyətindən təxminən 1,5 dəfə yüksəkdir. 4 ipdən istifadə edərkən - 3 dəfə.


Qeyd edə bilərsiniz ki, prosessor 8 nüvəli olsa da, 4-dən çox ipdən istifadə olunarsa, proqramın icra müddəti demək olar ki, dəyişməz qaldı. Görünür, bu, mənim prosessorumda 4 fiziki nüvəyə malik olması ilə əlaqədardır ki, aydınlıq üçün mən lövhəni diaqram şəklində təsvir etmişəm.


Xülasə

PHP-də pthreads uzantısından istifadə edərək çox iş parçacığı ilə kifayət qədər zərif işləmək mümkündür. Bu, məhsuldarlığın nəzərəçarpacaq dərəcədə artmasına səbəb olur.

Teqlər: Teqlər əlavə edin

Bəzən eyni vaxtda bir neçə hərəkəti yerinə yetirmək lazım olur, məsələn, bir verilənlər bazası cədvəlində dəyişiklikləri yoxlamaq və digərinə dəyişikliklər etmək. Üstəlik, əməliyyatlardan biri (məsələn, dəyişikliklərin yoxlanılması) çox vaxt aparırsa, ardıcıl icranın resurs balansını təmin etməyəcəyi açıqdır.

Bu cür problemi həll etmək üçün proqramlaşdırma multithreading istifadə edir - hər bir əməliyyat ayrılmış miqdarda resurs ilə ayrıca bir ipə yerləşdirilir və onun daxilində işləyir. Bu yanaşma ilə bütün tapşırıqlar ayrıca və müstəqil şəkildə yerinə yetiriləcəkdir.

PHP çox iş parçacığını dəstəkləməsə də, onu təqlid etmək üçün bir neçə üsul var ki, bunlar aşağıda müzakirə olunacaq.

1. Skriptin bir neçə nüsxəsini işlətmək - hər əməliyyat üçün bir nüsxə

//woman.php if (!isset($_GET["thread"])) ( system("wget ​​http://localhost/woman.php?thread=make_me_happy"); system("wget ​​http: //localhost/ woman.php?thread=make_me_rich"); ) elseif ($_GET["thread"] == "məni_xoşbəxt etmək") ( make_her_happy(); ) elseif ($_GET["thread"] == "məni_zəngin etmək" ) (başqasını_tap(; )

Bu skripti parametrlərsiz icra etdikdə, o, avtomatik olaraq iki nüsxəsini işlədir, əməliyyat identifikatorları ilə (“thread=make_me_happy” və “thread=make_me_rich”) lazımi funksiyaların icrasına başlayır.

Beləliklə, biz istədiyiniz nəticəyə nail oluruq - iki əməliyyat eyni vaxtda həyata keçirilir - lakin bu, əlbəttə ki, çox iş parçacığı deyil, sadəcə olaraq eyni vaxtda tapşırıqları yerinə yetirmək üçün bir qoltuqaltıdır.

2. Jedi yolu - PCNTL uzantısından istifadə etməklə

PCNTL, proseslərlə tam işləməyə imkan verən bir uzantıdır. İdarəetmə ilə yanaşı, mesajların göndərilməsini, statusun yoxlanılmasını və prioritetlərin təyin edilməsini dəstəkləyir. PCNTL istifadə edən əvvəlki skript belə görünür:

$pid = pcntl_fork(); if ($pid == 0) ( make_her_happy(); ) elseif ($pid > 0) ( $pid2 = pcntl_fork(); if ($pid2 == 0) (başqa_birini tap(); ) )

Olduqca çaşqın görünür, gəlin onu sətir-sətir keçirək.

Birinci sətirdə biz cari prosesi “çəngəlləyirik” (çəngəl bütün dəyişənlərin dəyərlərini qoruyaraq prosesi kopyalayır), onu paralel olaraq işləyən iki prosesə (cari və uşaq) bölürük.

Hazırda uşaq və ya ana prosesində olduğumuzu anlamaq üçün pcntl_fork funksiyası uşaq üçün 0, ana üçün proses identifikatoru qaytarır. Buna görə də ikinci sətirdə $pid-ə baxırıq, əgər sıfırdırsa, onda biz uşaq prosesindəyik - funksiyanı yerinə yetiririk, əks halda biz anadayıq (sətir 4), sonra başqa bir proses yaradırıq və eyni şəkildə tapşırığı yerinə yetirin.

Skript icra prosesi:

Beləliklə, skript onun nüsxələri olan və oxşar dəyərlərə malik eyni dəyişənləri ehtiva edən daha 2 uşaq prosesi yaradır. Və pcntl_fork funksiyası tərəfindən qaytarılan identifikatordan istifadə edərək, hazırda hansı ipdə olduğumuzu tapırıq və lazımi hərəkətləri edirik.

Görünür, PHP tərtibatçıları nadir hallarda paralellikdən istifadə edirlər. Sinxron kodun sadəliyi haqqında danışmayacağam, əlbəttə ki, daha sadə və aydındır, lakin bəzən paralellikdən bir az istifadə performansda nəzərəçarpacaq artım gətirə bilər;

Bu yazıda biz pthreads genişlənməsindən istifadə edərək PHP-də multithreading necə əldə oluna biləcəyinə nəzər salacağıq. Bunun üçün quraşdırılmış pthreads v3 genişləndirilməsi ilə birlikdə PHP 7.x-in ZTS (Zend Thread Safety) versiyasının quraşdırılması tələb olunacaq. (Yazı zamanı PHP 7.1-də istifadəçilər pthreads repozitoriyasında master filialından quraşdırmalı olacaqlar - üçüncü tərəf genişləndirilməsinə baxın.)

Kiçik bir izahat: pthreads v2 PHP 5.x üçün nəzərdə tutulub və artıq dəstəklənmir, pthreads v3 PHP 7.x üçündir və fəal şəkildə inkişaf etdirilir.

Belə bir kənarlaşmadan sonra gəlin birbaşa mətləbə keçək!

Birdəfəlik tapşırıqların işlənməsi

Bəzən siz birdəfəlik tapşırıqları çox yivli şəkildə emal etmək istəyirsiniz (məsələn, bəzi I/O ilə bağlı tapşırıqları yerinə yetirməklə). Belə hallarda siz Thread sinfindən istifadə edərək yeni başlıq yarada və ayrı bir mövzuda bəzi emal apara bilərsiniz.

Misal üçün:

$task = yeni sinif Mövzunu genişləndirir ( şəxsi $cavab; ictimai funksiya run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $matches); $this->cavab = $matches; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) "Google"

Burada run metodu bizim emalımızdır, hansı ki, yeni başlıq daxilində icra olunacaq. Thread::start çağırıldıqda yeni başlıq yaranır və run metodu çağırılır. Sonra Thread::join çağıraraq uşaq mövzunu yenidən əsas mövzuya birləşdiririk, bu, uşaq ipin icrasını bitirənə qədər bloklanacaq. Bu, nəticəni çap etməyə çalışmazdan əvvəl tapşırığın icrasını başa çatdırmasını təmin edir (bu, $task->cavabda saxlanılır).

Bir sinfi axın məntiqi ilə əlaqəli əlavə öhdəliklərlə (bir qaçış metodunun müəyyən edilməsi məsuliyyəti də daxil olmaqla) çirkləndirmək arzuolunmazdır. Bu cür sinifləri Threaded sinfindən miras alaraq ayıra bilərik. Sonra onlar başqa bir ipin içərisində işlədilə bilər:

Sinif Tapşırığı Threaded-i genişləndirir ( ictimai $response; ictimai funksiya someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ this->cavab = $uyğundur ) ) $task = yeni Tapşırıq; $thread = new class($task) Mövzunu genişləndirir ( şəxsi $task; ictimai funksiya __construct(Treaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork() ); $thread->start() && $thread->join(); var_dump($task->cavab);

Ayrı bir mövzuda işlədilməli olan hər hansı bir sinif lazımdır Threaded sinfindən miras alın. Bunun səbəbi, müxtəlif mövzularda emal etmək üçün lazımi imkanları, həmçinin gizli təhlükəsizlik və faydalı interfeysləri (məsələn, resurs sinxronizasiyası) təmin etməsidir.

Gəlin pthreads uzantısının təklif etdiyi sinif iyerarxiyasına nəzər salaq:

Yivli (Traversable, Collectable) Thread Worker Volatile Pool

Biz artıq Thread və Threaded siniflərinin əsaslarını əhatə etdik və öyrəndik, indi gəlin digər üçünə (İşçi, Uçucu və Hovuz) nəzər salaq.

Mövzuların təkrar istifadəsi

Paralelləşdirilməli olan hər bir tapşırıq üçün yeni mövzuya başlamaq olduqca baha başa gəlir. Bunun səbəbi, PHP daxilində çoxilliklərə nail olmaq üçün pthreads-də ümumi-heç bir arxitektura tətbiq edilməlidir. Bu o deməkdir ki, PHP tərcüməçisinin cari nümunəsinin bütün icra konteksti (hər sinif, interfeys, əlamət və funksiya daxil olmaqla) yaradılmış hər bir ip üçün kopyalanmalıdır. Bunun nəzərəçarpacaq performans təsirinə malik olduğu üçün axın həmişə mümkün olduqda təkrar istifadə edilməlidir. Mövzular iki şəkildə təkrar istifadə edilə bilər: İşçilərdən istifadə və ya Hovuzlardan istifadə.

İşçi sinfi bir sıra tapşırıqları sinxron olaraq başqa bir mövzu daxilində yerinə yetirmək üçün istifadə olunur. Bu, yeni İşçi nümunəsi yaratmaqla (yeni mövzu yaradır) və sonra tapşırıqları həmin ayrı mövzu yığınına itələməklə (İşçi:: yığınından istifadə etməklə) edilir.

Budur kiçik bir nümunə:

Sinif Tapşırığı Yivli ( şəxsi $value; ictimai funksiya __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $işçi = yeni İşçi(); $işçi->start(); üçün ($i = 0; $i yığını(yeni Tapşırıq($i)); ) while ($işçi->toplama()); $işçi->bağlama();

Yuxarıdakı misalda yeni $worker obyekti üçün 15 tapşırıq Worker::stack metodu ilə yığına itələnir və sonra onlar itələndikləri ardıcıllıqla işlənir. İşçi::toplama metodu, yuxarıda göstərildiyi kimi, tapşırıqların icrasını bitirən kimi onları təmizləmək üçün istifadə olunur. Bununla, bir müddət döngəsi içərisində, yığındakı bütün tapşırıqlar tamamlanana və təmizlənənə qədər əsas ipi bloklayırıq - biz Worker::shutdown çağırmadan əvvəl. İşçini vaxtından əvvəl dayandırmaq (yəni hələ tamamlanmalı olan tapşırıqlar olsa da) bütün tapşırıqlar icrasını tamamlayana qədər əsas mövzunu bloklayacaq, sadəcə olaraq, tapşırıqlar zibil yığılmayacaq (bu, yaddaş sızması deməkdir).

İşçi sinfi son yığılmış tapşırığı silmək üçün Worker::unstack və icra yığınında tapşırıqların sayını əldə etmək üçün Worker::getStacked daxil olmaqla, tapşırıq yığını ilə bağlı bir neçə başqa üsul təqdim edir. İşçi yığını yalnız yerinə yetirilməli olan tapşırıqları ehtiva edir. Yığındakı tapşırıq yerinə yetirildikdən sonra o, çıxarılır və zibil toplamaq üçün ayrıca (daxili) yığına yerləşdirilir (İşçi::toplama metodundan istifadə etməklə).

Bir çox tapşırıqda ipdən təkrar istifadə etməyin başqa bir yolu iplik hovuzundan istifadə etməkdir (Pool sinfi vasitəsilə). İplik hovuzu tapşırıqların icrasını təmin etmək üçün bir qrup İşçidən istifadə edir eyni vaxtda, hovuz yaradılarkən paralellik əmsalı (birlikdə işlədiyi hovuz iplərinin sayı) təyin olunur.

Yuxarıdakı nümunəni işçilər hovuzundan istifadə etmək üçün uyğunlaşdıraq:

Sinif Tapşırığı Yivli ( şəxsi $value; ictimai funksiya __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Task: ($this->value) \n"; ) ) $hovuz = yeni Hovuz(4); for ($i = 0; $i submit(yeni Tapşırıq($i)); ) while ($pool->topla()); $pool->sutdown();

Bir işçidən fərqli olaraq hovuzdan istifadə edərkən bir neçə diqqətəlayiq fərq var. Birincisi, hovuzun əl ilə işə salınmasına ehtiyac yoxdur; İkincisi, biz göndər hovuza tapşırıqlar deyil onları bir yığına qoyun. Bundan əlavə, Pool sinfi Threaded-dən miras alınmır və buna görə də digər mövzulara ötürülə bilməz (İşçidən fərqli olaraq).

İşçilərin və hovuzların tapşırıqlarını yerinə yetirən kimi həmişə təmizləmələri və sonra onları əl ilə dayandırmaları yaxşı təcrübədir. Thread sinfindən istifadə etməklə yaradılan mövzular da ana ipə əlavə edilməlidir.

pthreads və (im) dəyişkənlik

Toxunacağımız sonuncu sinif pthreads v3-ə yeni əlavə olan Uçucudur. Dəyişməzlik pthreads-də vacib bir anlayışa çevrildi, çünki onsuz performans əhəmiyyətli dərəcədə azalır. Buna görə də, standart olaraq, Threaded siniflərinin özləri Threaded obyektləri olan xassələri indi dəyişməzdir və buna görə də onların ilkin təyinatından sonra onların üzərinə yazıla bilməz. Bu cür xüsusiyyətlər üçün açıq-aşkar dəyişkənliyə üstünlük verilir və hələ də yeni Uçucu sinifdən istifadə etməklə əldə edilə bilər.

Yeni dəyişməzlik məhdudiyyətlərini nümayiş etdirəcək bir nümunəyə baxaq:

Sinif Tapşırığı Threaded-i genişləndirir // Yivli sinif ( ictimai funksiya __construct() ( $this->data = new Threaded(); // $this->data Threaded sinfinin Threaded xüsusiyyəti olduğu üçün üzərinə yazıla bilməz ) ) $task = new class(new Task()) Thread-ı genişləndirir ( // Yivli sinif, çünki Thread Threaded ictimai funksiyasını genişləndirir __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data // object(Threaded)#3 (0) () $this->threadedMember = new StdClass(); // etibarsız, çünki bu xüsusiyyət Threaded sinifinin üzvüdür ) );

Uçucu siniflərin yivli xassələri isə dəyişkəndir:

Sinif Tapşırığı Uçucunu genişləndirir ( ictimai funksiya __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // etibarlıdır, çünki biz uçucu sinifdəyik ) ) $task = new class(new Task()) Mövzunu genişləndirir ( ictimai funksiya __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // object(stdClass)#4 (0) () // hələ də etibarsızdır, çünki Volatile Threaded-i genişləndirir, ona görə də xassə hələ də Yivli sinifin Yivli üzvüdür $this->volatileMember = new StdClass() );

Görə bilərik ki, Volatile sinfi Threaded xassələrini dəyişdirmək qabiliyyətini (həmçinin unset()) təmin etmək üçün ana Threaded sinfi tərəfindən qoyulmuş dəyişməzliyi ləğv edir.

Dəyişkənlik və Uçucu sinif mövzusunu əhatə edən başqa bir müzakirə mövzusu var - massivlər. Pthreads-də massivlər Threaded sinifinin xassəsinə təyin edildikdə avtomatik olaraq Uçucu obyektlərə ötürülür. Bunun səbəbi, bir neçə PHP kontekstindən ibarət bir sıra manipulyasiya etməyin sadəcə təhlükəsiz olmamasıdır.

Bəzi şeyləri daha yaxşı başa düşmək üçün bir daha nümunəyə baxaq:

$massiv =; $task = new class($array) Mövzunu genişləndirir ( şəxsi $data; ictimai funksiya __construct(array $array) ( $this->data = $array; ) public function run() ( $this->data = 4; $ this->data = 5; print_r($this->data) ); $task->start() && $task->join(); /* Çıxış: Uçucu Obyekt ( => 1 => 2 => 3 => 4 => 5) */

Biz görürük ki, Uçucu obyektlərə massiv kimi baxıla bilər, çünki onlar (yuxarıda göstərildiyi kimi) subset() operatoru kimi massiv əməliyyatlarını dəstəkləyir. Bununla belə, Uçucu siniflər array_pop və array_shift kimi əsas massiv funksiyalarını dəstəkləmir. Bunun əvəzinə Threaded sinfi bizə daxili metodlar kimi əməliyyatları təqdim edir.

Nümayiş olaraq:

$data = yeni sinif Uçucunu genişləndirir ( ictimai $a = 1; ictimai $b = 2; ictimai $c = 3; ); var_dump($data); var_dump($data->pop()); var_dump($data->shift()); var_dump($data); /* Çıxış: obyekt(class@anonim)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) obyekt(class@anonim)#1 (1) ( ["b"]=> int(2) ) */

Digər dəstəklənən əməliyyatlara Threaded::chunk və Threaded::merge daxildir.

Sinxronizasiya

Bu məqalənin son bölməsində pthreads-də sinxronizasiyaya baxacağıq. Sinxronizasiya paylaşılan resurslara girişi idarə etməyə imkan verən bir üsuldur.

Məsələn, sadə sayğac tətbiq edək:

$counter = yeni sinif Mövzunu genişləndirir ( ictimai $i = 0; ictimai funksiya run() ( üçün ($i = 0; $i i; ) ) ); $counter->start(); üçün ($i = 0; $i i; ) $counter->join(); var_dump($counter->i); // 10-dan 20-yə qədər rəqəm çap edəcək

Sinxronizasiyadan istifadə etmədən çıxış deterministik deyil. Birdən çox başlıq idarə olunan giriş olmadan eyni dəyişənə yazır, yəni yeniləmələr itəcək.

Gəlin bunu düzəldək ki, vaxtı əlavə etməklə 20-nin düzgün çıxışını əldə edək:

$counter = yeni sinif Mövzunu genişləndirir ( ictimai $i = 0; ictimai funksiya run() ( $this->sinxronlaşdırılmış(funksiya () ( ($i = 0; $i i; ) ); ) ); $counter->start(); $counter->sinxronlaşdırılmış(funksiya ($counter) ( üçün ($i = 0; $i i; ) ), $counter); $counter->qoşulmaq(); var_dump($counter->i); // int(20)

Sinxronlaşdırılmış kod blokları həmçinin Threaded::wait və Threaded::notify (və ya Threaded::notifyAll) metodlarından istifadə edərək bir-biri ilə əlaqə saxlaya bilər.

Budur, iki sinxronlaşdırılmış while döngəsində alternativ artım:

$counter = yeni sinif Mövzunu genişləndirir ( ictimai $cond = 1; ictimai funksiya run() ( $this->sinxronlaşdırılmış(funksiya () ( üçün ($i = 0; $i bildiriş(); əgər ($this->cond) === 1) ( $this->cond = 2; $this->wait(); ) ) )); $counter->start(); $counter->synchronized(funksiya ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // birinci başqasının başlamasını gözləyin ) üçün ($i = 10; $i notify(); if ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->qoşulmaq(); /* Çıxış: 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) */

Siz Threaded::wait zəngi ətrafında əlavə şərtlərin olduğunu görə bilərsiniz. Bu şərtlər kritikdir, çünki onlar bildiriş qəbul etdikdə və göstərilən şərt doğru olduqda sinxronlaşdırılmış geri çağırışın davam etdirilməsinə imkan verir. Bu vacibdir, çünki bildirişlər Threaded::notify çağırıldığından başqa yerlərdən gələ bilər. Beləliklə, Threaded::wait metoduna edilən zənglər şərtlərə daxil edilməmişdirsə, biz icra edəcəyik yalançı oyanma zəngləri, bu, gözlənilməz kod davranışına səbəb olacaq.

Nəticə

Biz pthreads paketinin beş sinfinə (Threaded, Thread, Worker, Volatile və Pool) və hər bir sinfin necə istifadə edildiyinə baxdıq. Biz həmçinin pthreads-də dəyişməzliyin yeni konsepsiyasına nəzər saldıq və dəstəklənən sinxronizasiya imkanları haqqında qısa məlumat verdik. Bu əsasları yerinə yetirməklə, indi pthreadların real dünya vəziyyətlərində necə istifadə oluna biləcəyinə baxmağa başlaya bilərik! Bu, növbəti yazımızın mövzusu olacaq.

Növbəti yazının tərcüməsi ilə maraqlanırsınızsa, mənə bildirin: sosial mediada şərh yazın. şəbəkələrdə səs verin və postu həmkarlarınız və dostlarınızla paylaşın.



Əlaqədar nəşrlər