Za koje postupke počinjene u pijanom, da li ste vrlo sramotni? Rezultati ispitivanja performansi panike

Srčana neuroza (kardiofobija). Poseban oblik fobije zajedno sa paničnom sindromom je kardiofobija, koja bi se trebala biti opisana posebno zbog karakteristične klinike i značajne frekvencije. Uglavnom se nalazi kod mladih, češće kod muškaraca, kao i djece.

Uslovno alarm stanjaU kojem pacijente se boje prestanka srca i pojava smrti mogu se pojaviti bez prisustva somatske bolesti. Na početku sljedećeg napada pojavit će se mučnina, vrtoglavica, unutrašnja zabrinutost, svjetlosnom kompresijom srca.

Međutim, u mnogim slučajevima se pojavljuje težak napad bez ikakvih prekursora: jak otkucaj srca, osjećao se po cijelom tijelu, neki porast krvni pritisak, veliki osećaj kompresije i ograničenja u polju srca, nedostatak zraka, znojenja, vrtoglavice i osjećaja nespuštene države (ali ne gubitak svijesti), drhtanje u cijelom tijelu i elementarnom strahu. Pacijent vjeruje da će mu srce prestati preko sekunde i on će ispasti. Ovo je strah od samouništavanja i smrti. Za snažna uzbuđenja Pacijenti trče i mole za pomoć. Ako se napad straha nastavi tokom putovanja do automobila, pacijent je prisiljen da se zaustavi i odmara.

Nakon prvog napada, dolazi do fobičkog razvoja. Pacijenti izgube mentalnu ravnotežu, žive u stalnom strahu, očekujući još jedan napad ili smrt, doživljavajući strah od straha (očekivanje straha, fobia). Istovremeno ne pomažu ni poruku terapeuta normalni indikatori Srce djeluje niti uvjeravanje da prethodni napadi nisu imali posljedice. Učestalost napada i praznina između njih je nepravilna. U intervalima pacijent je opasan nakon njihovih funkcija srca, kontrolira puls i registruje najmanja odstupanja. Ležerni ekstrasioli koje opaža kao neosporne znakove bolesti sa beznadnim ishodom.

Pokretanje pacijenata se posmatra za druge vegetativne manifestacije, kao i iza lakih fluktuacija njihovog blagostanja. Pacijenti se štite, teško se usuđuju hodati, nastoje eliminirati sva opterećenja, uzbuđenja i prvenstveno teške situacije kako bi se spriječili napad (izbjegavanje ponašanja). Umjesto straha od smrti, u mnogim se slučajevima strah od straha sve više suočava sa strahom od nastalih situacija.

Uslovi pojave. Razlog prvog kartofobnog napada češće je oštar sukob i prenapona, razdvajanje i razočaranje, situacija usamljenosti i napuštanja, kao i iskustvo u slučaju nekoga od najmilijih.

Znajući da se smrt srca uvijek može dogoditi, čak i mladi i zdravi postaju uznemirujući faktor. Intenzivna upotreba kafe i nikotina može prouzrokovati ovaj proces u životu. Početak često dolazi iz djetinjstva. Poželjno je pogođen deponovanom i ne izvedivom djecom sa matičnom ovisnošću o majci, u mnogim aspektima sa ambivalentnim instalacijama: čekanje ljubavi, s jedne strane, i želja neovisnosti sa agresivnim impulsima - s druge strane, sa opremom, sa opremom, sa kontradiktornim fantazijama vezanosti i razdvajanja. Takve su instalacije posebno opasne pri razbijanju veza, odvajanja i razočaranja. Kardofobici često živi u strahu prije odvajanja, prije nego što razumijem da želi i on se boji. Redovito nastaju zajednički problemi sa roditeljima i sukobima sa partnerima.

Tretman
Ako u akutno stanje Prisutnost ljekara i razgovora s njom ne uzrokuje poboljšanja, prikazivanja sredstava ili beta blokatora. Kao i ostali pacijenti za neurozu sa strahom, mnogi phobs pokušavaju izvesti alkohol; Ali učinak njenog nedovoljnog i opasnost od pojave ovisnosti o alkoholu je velik. Farmakoterapija je samo uslužni program, prije svega u akutnim slučajevima, kao i početni efikasan alat.

Odlučujući je psihoterapija. Što prije počinje, to bolje. Proučavanje razloga I. sukovne situacije Odmah nakon prvih kartofobnih napadaja mogu obustaviti naknadni fobički razvoj. Kasnije je tretman teži i zahtijeva dugu psihoterapiju.

Uz ove i druge alarmantne poremećaje, posebno je prikazana terapija ponašanja (uzbudljiva sukoba, kognitivna terapija, obuka za obuku). Izrazita karakteristika anksioznosti anksioznosti je da djeluje na modelu desenzibilizacije (na relevantne uvjete običnih situacija) i obuku upravljanja alarmom - uz pomoć prisilnog uranjanja u fobičku situaciju (poplavu) i formiranje strategija za prevladavanje. S teškim alarmantnim poremećajima potrebno je provoditi klinički tretman Korištenje različitih modela psihoterapije.


02.10.2011, 21:27

Za činjenicu da muškarac tukao i visio majicu na drvetu. I momak idiota jednog jurnjava nekoliko kilometara i kad je pao počeo pisati na njega. Ali oni to zaslužuju.

Ja sam u velikoj kompaniji zaglavljen u djevojci i rekao da je njen dečko kupio svog dečka, a još uvek jeo banane i ogulite sve u močvari u močvaru da se na kolenama ne piju, zaboravi da volim ljude izreke ako vi Probudio se i stidi se, ali ne sećate se šta se tačno radi sa mnom

Nakon zadnjeg pića, lažem:
1. Oracle sa balkona muškarac "Dump"
2. proždirao cigaretu
3. Žudne jabuke
4. Pozvao se momku i rekli, sho, ne dajem seks u grubom obliku
5. Topila Bulls u soku od grejpa
6. zvanu mama i rekla mi da sam trijezan
7. Devojčica Oraza, tako da nam je donio vina
8. Pisao sam pored toaleta, jer ih je bilo dva izabrano, a onda je pao
9. Hrana iz kupatila

Otišao sam nožem za muža u stanu još jednom, iako sam pio šampanjac nekoliko čaša. Sljedećeg jutra postalo je užasno - i odjednom bih zaustavio nož, upravo sam odlučio da birt. I ne znam zašto sam našao tako skok!

Trajno jedno, kao što idem u park Drazersa da tražim, šta bismo na njima ili temama dobili na forumu koje stvaram ... Mislim, a ne budala? ... ... ...

Nekako sam zalijepljen prema meni, i bio sam tako klikom da sam mu počeo objašnjavati popularno, rekavši da ništa neće ništa slomiti, jer sam "Krvava Mary" (CD je bio mirisao na ovu klikenost da sam skoro svaki razgovor vrisnuo: "Ja sam krvava Mary", korist da nije bio u mom rodnom gradu

- * zvano bivše, izrazio je sve o njemu što mislim
* nazvao voljenom osobom, rekao sam kako ga želim
* ate shawarma sa folijom
* Tip je oblik, s kim u klubu sreo, iako mi je pomogao, doveo vozača
* plesani striptiz u klubu u konkursu, primio je drugo mjesto
* bačen ledom u nepoznati momak
* Prijatelj mog muškarca na žutom vožnji Hamerel. Nikoga više nisam vidio u Koreji. Kad smo svi otišli glupo. Naslonio sam se iz automobila svog muškarca i, pokazujući ispred hame za jahanje, oralno da je ovaj automobil moj prijatelj
* Juče sam bio u klubu. Kad sam otišao kući ujutro zbog taksija, rekao sam vozaču: [prijevod iz Koreana. Doslovno!] "Hrana koju sam jeo, rekla mi je samo da želi izaći!"
* Takođe imam i prijatelja Mongola. Popeo sam se na njega na leđima, naterao ga da me nosi na leđima i na cijeloj ulici usmenog da je moj mongolski konj
Općenito, bilo je još puno stvari, nikad se ne sjećate ...

Momak je napisao u 4 ujutro " laku noc, skupo "

Napio sam se sa prijateljima djevojke, svi su otišli kući, a ja sam nazvao taksijem (bilo je 3 sata ujutro) i otišao u bivšeg momka s kojom sam se sjećao prije 4 mjeseca. (Ostao sam prijatelje). Sjećam se kako sam ušao u ulaz , Stigao sam u njegov stan, postao sam da se slomim na vrata i vičem "oženi se" Maratom ", ja sam siromašan Okrenel. Imam hladan dom i pod hladnim tušem, imam snažan čaj. Sati sam se preselio. Dva sata, a onda sam izašao oko sat vremena, a kad sam to učinio nerealno. Nakon ovoga sam propustio i još uvijek zajedno. Nakon toga ne pijem više čaša šampanjca.


...

02.10.2011, 22:09

Ubijen je otišao sa momkom kroz vrt i tada mi se činilo da me nekako uvrijedio zbog onoga što je prelazilo nekoliko koraka ispred mene, a ne okolo. Bio sam uvrijeđen i popeo sam se na drvo, a on nije primijetio ... trčao je po vrtu sat vremena i pol i pretražen za mene ..... i ja sam mirno izašao na drvo i spavao do stabla i spavao do jutra . ...
...
Ali ujutro se nisam mogao odmah sjećati kako sam pronađen na granama. Stons-yyyyy-dno je kako je bilo
; D; d; d

Tumačenje

02.10.2011, 22:42

sramim se određenih akcija počinjenih u trijeznoj formi :) Ali bliže je filozofiji. U pijanom ... bodi se puno je bilo zabavno, stidim se .. nazad, izvini))))))

Elena Lotus.

02.10.2011, 23:17

Juče, nakon što sam shvatio da moj telefon (OOO !!!) Sada nisam pijan. Nemojte reći niko (ko me poznaje, nemojte reći da pijem kao miš), onda sam to učinio ... Samo bliski prijatelji u velikoj tajnosti, a onda ću razmišljati o kome možete reći ... Restoran "Pabety" ponovo je bio šokiran. Sada pogledam u fotogaleriju u nadi da ćemo vidjeti rezultirajući :(, ali ne stidi se. .. ne ... Samo sam mislio da mislim da sam pristojan.

02.10.2011, 23:31

; D; d; d
Oduvek sam tvrdio da ne možete piti piliće !!! Svi !!!;)

..; d; d; d True reci

02.10.2011, 23:36

Pijana žena - poput kineske jakne: meka i penje.
Galygin

Elena Lotus.

02.10.2011, 23:41

možete li voljeti muškarce da? Možete sve piti. I testov i ujak ... samo treba nešto tako ... danas glava ne boli .. viseće povrijeđeno ... napije se? Ravno zatvoreni krug;)

03.10.2011, 00:15

Pijte sve i sve dok ste mladi i zdravlje :)

03.10.2011, 01:48

selektivno sperme iz ženskog foruma :)

Skoro sam napisao košaru za posteljinu, kad je mama ..... pokupila wc .... oops ....

Ubijen je otišao sa momkom kroz vrt i tada mi se činilo da me nekako uvrijedio zbog onoga što je prelazilo nekoliko koraka ispred mene, a ne okolo. Bio sam uvrijeđen i popeo sam se na drvo, a on nije primijetio ... trčao je po vrtu sat vremena i pol i pretražen za mene ..... i ja sam mirno izašao na drvo i spavao do stabla i spavao do jutra . ...
...
Ali ujutro se nisam mogao odmah sjećati kako sam pronađen na granama. Stons-yyyyy-dno je kako je bilo

Bilo je bazena i lonca na balkonu, gdje je mama odrasla luk. "Nasal" nasal na svakom od ovih lonca \u003d (((((naravno) moja majka neću reći, baciti sve jebote U smeću sam ovdje, odlučio sam se izvući iz vaših zelenila! Pa, odrastao je, a zatim otišao u salatu

03.10.2011, 05:35

Napio sam se sa prijateljima djevojke, svi su otišli kući, a ja sam nazvao taksijem (bilo je 3 sata ujutro) i otišao u bivšeg momka s kojom sam se sjećao prije 4 mjeseca. (Ostao sam prijatelje). Sjećam se kako sam ušao u ulaz , Stigao sam u njegov stan, postao sam da se slomim na vrata i vičem "oženi se" Maratom ", ja sam siromašan Okrenel. Imam hladan dom i pod hladnim tušem, imam snažan čaj. Sati sam se preselio. Dva sata, a onda sam izašao oko sat vremena, a kad sam to učinio nerealno. Nakon ovoga sam propustio i još uvijek zajedno. Nakon toga ne pijem više čaša šampanjca.

To je sasvim prava priča Ljubav.
I o prednostima pijanstva.

(Piće, djevojke i doći će do vas.)

Mreža hoda prilično puno rješenja za oponašanje multithreading u PHP-u. Najčešće se temelje na snagama, ali postoje i varijacije na temi koristeći Curl, Proc_Open itd.

Sve pohvaljene mogućnosti iz jednog ili drugog razloga mi nisu odgovarale i morale su napisati njegovu odluku.
Skup zahtjeva koje sam imao sljedeće:

  • Korištenje vilica;
  • Sinhroni režim sa očuvanjem sučelja u nedostatku potrebnih proširenja;
  • Opetovana upotreba podružnica;
  • Potpuna razmjena podataka između procesa. Oni. lansirati argumente i dobijanje rezultata završenim;
  • Mogućnost razmjene događaja između podružnice "potoka" i glavnog procesa tokom rada;
  • Rad sa bazenom potoka sa očuvanjem višestruke upotrebe, prijenosa argumenata i dobivanje rezultata;
  • Pogreške greške u obradi;
  • Vremena za obavljanje radova, čekajući protok, inicijalizacija;
  • Maksimalne performanse;
Kao rezultat toga, ispostavilo je biblioteku Azathread. (Staro ime - chret).

Za nestrpljiv odmah povezan sa izvorima:
github.com/anizoptera/azathread.

Opis

Azathread pruža jednostavno sučelje za stvaranje klase potoka. Što zapravo koristi pojedinačne procese za asinhrono djelo, ali ne biste trebali brinuti. Možete slati događaje iz niti, vratiti rezultate, koristite jedan nit podešen za prijenos argumenata lansiranja ili stvoriti bazen od 16 niti koji neželjni vaši zadaci kao vrućih kolača ne obraćaju činjenicu da se rad događa u različitim procesima .

Pored toga, možete lako testirati performanse biblioteke u različitim režimima odabirom optimalnog broja struja i opciju prenosa podataka između procesa posebno za vašu konfiguraciju.

Za puni rad zahtijeva sljedeća proširenja: libevent, posix. i pcntl.

Biblioteka koristi Libevent i uparene utičnice za komunikaciju između procesa. Podržava 5 opcija prijenosa podataka (argumenti, rezultati i događaji podataka)!

Opcije su odmah s podacima o performansama. Ispitano sa bazenom od osam potoka na Intel Core i7 2600K 3,40 GHz (Ubuntu 11.04 na VMware virtualnim). Prosječni rezultati za 10 tijesta ponavljaju se u JPS-u (JOPS u sekundi je broj zadataka koji jednostavno primaju argumente i daju podatke u sekundi).

Automatski odabrano proširenje za rad sa utičnicama. Ako je dostupan, a zatim se koristi ekstenzije utičnice.Što čini poboljšanje performansi. Inače uključeni potok.

U djetetu su svi dostupni signali slušali. Prema zadanim postavkama, svi (osim Sigwinch-a i Siginfo) završetka rada. Ali lako može nadjačati kreiranjem metode s imenom signala u razredu protoka. na primjer sigwinch..

U roditeljskom procesu svi signali također se pokupljaju prema zadanim postavkama. To se može promijeniti postavljanjem parametra slušajteMastersignals. Lažno. U ovom slučaju će se obraditi samo SigChld. Možete lako dodati svoje rukovodioce stvaranjem statičke metode koja se zove m.< имя сигнала > . na primjer msigterm..

Ako će dijete umrijeti iz bilo kojeg razloga, klasa će se automatski voziti kada pokrene novi zadatak. To se neprimetno događa i ne možete uopšte razmišljati o tome. Samo instance ne trebaju ponovo posjedovati u slučaju bilo kakve pogreške.

Dječji proces s vremena na vrijeme provjerava postojanje roditelja. Ako iznenada umre, dijete će se završiti.

Svi resursi koji koriste potok ili bazen niti automatski se čiste kada se zove destruktor. Ali mogu se očistiti prisiljeni ako nazovete metodu Čišćenje.. U ovom slučaju protok / bazen se više ne može koristiti.

Za standardne postavke Protok se inicijalizira unaprijed, odmah prilikom stvaranja klase. Ako postavite parametar preformirati False, vilica će se pojaviti samo u trenutku pokretanja zadatka.

Generalno prilagodljivi parametri su prilično puno. Promjena imena dječijeg procesa nakon obrasca (parametar) prname. Konstruktor), istek u vrijeme završetka zadatka ( istraživanje.), Istek vremena u maksimalnom zadatku zadataka djetetu proces ( tIMEOUTMAXWAIT.), istek vremena za prethodno inicijalizaciju ( tIMEOUTINIIT.), veličine pufera za čitanje utičnica ( pipereadsize., pipemasterReadsize).
Možete onemogućiti multitasque mod za potoke ( multitask.). U ovom slučaju, svaki put kada je zadatak završen, dječji proces će umrijeti i završiti za sljedeće lansiranje. To će primjetno smanjiti performanse.

Kodeks je prekriven testovima i dokumentovan detaljno, koristite primjere možete pogledati i pokrenuti u datoteci. primer.php..
Više složeni primjeri Obrada greške može se vidjeti u jediničnom kodu jedinice tijesta.

Postoji režim pogrešaka u kojem se uklanja vrlo detaljne informacije o tome šta tačno i kuda se događa.

Primjeri upotrebe

Glavna karakteristika je maksimalna jednostavnost. Ako želite samo nešto pokrenuti u zasebnom "toku" dovoljan je za sljedeći kod:
Ispitivanje klase Proširenje navoja (Proces zaštićenog funkcije () (// Neki posao ovdje)) $ Thread \u003d Novi ispit (); $ Nit-\u003e čekati () -\u003e pokretanje ();
Ako postoji sve što vam je potrebno za punopravni rad, tada će zadatak biti izveden asinhrono. Ako ne, sve će i dalje raditi, ali u sinkronom režimu.

Uz prijenos parametra i dobijanjem rezultata, kôd će izgledati samo malo teže:
Class ExcestHread Proširi navoj (Proces zaštićenog funkcioniranja () (Povratak $ this-\u003e getparam (0);)) $ Thread \u003d Novi ispit (); $ navoj-\u003e čekati () -\u003e Run (123); $ Rezultat \u003d $ Navoj-\u003e Čekaj () -\u003e GetResult ();

Slično kao lagano ručno, dodajte obradu događaja iz potoka:
Ispitivanje klase Proširenje navoda (CONST EV_PROCESS \u003d "Proces"; Proces zaštićenog funkcije () ($ događaji \u003d $ this-\u003e getparam (0); za ($ i \u003d 0; $ I< $events; $i++) { $event_data = $i; $this->okidač (samo :: ev_process, $ event_data); ))) // Dodatni argument. $ AllagelGument \u003d 123; $ Thread-\u003e vezati (ispiranje :: EV_Process, funkcija ($ Event_name, $ Event_DATA, $ weat_ARG) (// Obrada događaja), $ AUTALLICHURGE); $ Događaji \u003d 10; // broj događaja koji će generirati potok // Da ne biste čekali da tok prije prvog poziva // možete prebaciti svojstvo prednačenog mozga istiniti u navoj CASE $ -\u003e Čekaj (); $ Thread \u003d novi ispit (); $ Thread-\u003e Run ($ događaji) -\u003e pričekajte ();

Konačno, upotreba bazena od osam potoka sa obradom grešaka izvršenja:
$ Threads \u003d 8 // Broj potoka $ Pool \u003d Novi temeljit ("Ispitivanje ispitivanja", $ niti); $ num \u003d 25; // Broj zadataka $ lijevo \u003d $ Num; // Broj preostalih zadataka (// ako u bazenu ima besplatni potoci // imamo zadatke za pokretanje dok ($ bazen-\u003e HASPWiting () && $ lijevo\u003e 0) (// Kada pokrenete $ ThreaDid Id \u003d $ Basel-\u003e Run (); $ lijevo--;) Ako ($ Rezultati \u003d $ Basel-\u003e Čekaj ($ nije uspjelo)) (foreach ($ Rezultati kao $ ThreaD \u003d\u003e $ Rezultat) ($ rezultat) (// uspješno završeno) zadatak // Rezultat se može identificirati // po ID-u navoj ($ Thread) $ num--;)) ako ($ neuspjeh) (// pogreške obrade greške u obradi. // Rad se smatra potpunim neuspjehom // Ako je dijete umrlo tijekom izvršenja ili // istekao istek vremena na izvršenju zadatka foreach ($ nije uspio kao $ ThreaDid) ($ lijevo ++;))) dok ($ num\u003e 0); // Dovršite sve podružnice. Očistite resurse koje koriste bazen. $ Bazen-\u003e čišćenje ();

Rezultati ispitivanja performansi

Testovi su započeli na dvije mašine sa Ubuntu 11.04.
Prvo - Intel Core i3 540 3,07 GHz
Drugo - Intel Core i7 2600K 3,40 GHz (Ubuntu stoji na VMware virtual

Rezultati Donosim samo da možete procijeniti rast performansi.
Opet su to prosječni rezultati za seriju od 10 tijesta ponavljanja u JPS-u (poslovi u sekundi - broj zadataka u sekundi).

Kao zadatak, tokovi se izvode sljedećim smećem:
za ($ i \u003d 0; $ i< 1000; $i++) { $r = mt_rand(0, PHP_INT_MAX) * mt_rand(0, PHP_INT_MAX); }
Prvi rezultat je naveden za sinkroni način rada (bez viljuška).
18 i 20 niti na prvoj konfiguraciji nisam pokušao, jer je već za 12 bilo pad performansi.

Broj potoka Prva konfiguracija Sekunda
0 553 763
1 330 669
2 580 1254
4 1015 2188
8 1040 2618
10 1027 2719
12 970 2739
16 958 2904
18 - 2830
20 - 2730

Mislim na performanse raste u 2-4 ili više puta, ovisno o procesoru!

Kodeks koji vrši testnu seriju sa željenim parametrima leži u datoteci primjeri / Speed_test.php.. Dakle, lako možete testirati produktivnost i odabrati optimalni broj potoka.

Mreža hoda prilično puno rješenja za oponašanje multithreading u PHP-u. Najčešće se zasnivaju na snagama, ali postoje i varijacije na temi koristeći kovrdža, proc_open. itd.

Sve su prigodne mogućnosti iz jednog ili drugog razloga ili drugo nije odložilo i morao sam napisati svoju odluku. Skup zahtjeva koje sam imao sljedeće:

  • Korištenje vilica;
  • Sinhroni režim sa očuvanjem sučelja u nedostatku potrebnih proširenja;
  • Opetovana upotreba podružnica;
  • Potpuna razmjena podataka između procesa. Oni. lansirati argumente i dobijanje rezultata završenim;
  • Mogućnost razmjene događaja između podružnice "potoka" i glavnog procesa tokom rada;
  • Rad sa bazenom potoka sa očuvanjem višestruke upotrebe, prijenosa argumenata i dobivanje rezultata;
  • Pogreške greške u obradi;
  • Vremena za obavljanje radova, čekajući protok, inicijalizacija;
  • Maksimalne performanse.

Rezultat je bila biblioteka azathread (staro ime - chrthead).

Opis

Azathread pruža jednostavno sučelje za stvaranje klase potoka. Što zapravo koristi pojedinačne procese za asinhrono djelo, ali ne biste trebali brinuti. Možete slati događaje iz potoka, vratiti rezultate, koristite jedan tok više puta, prenoseći početne argumente na njega ili stvorite bazen od 16 niti u vašim zadacima kao vrućih kolača, bez obzira na činjenicu da se događa u činjenici da se radovi događa različiti procesi.

Pored toga, možete lako testirati performanse biblioteke u različitim režimima odabirom optimalnog broja struja i opciju prenosa podataka između procesa posebno za vašu konfiguraciju.

Za puni rad zahtijeva sljedeća proširenja: libevent, posix. i pcntl.

Biblioteka koristi Libevent i uparene utičnice za komunikaciju između procesa. Podržava 5 opcija prijenosa podataka (argumenti, rezultati i događaji podataka)!

Opcije su odmah s podacima o performansama. Ispitano sa bazenom od osam potoka na Intel Core i7 2600K 3,40 GHz (Ubuntu 11.04 na VMware virtualnim). Prosječni rezultati za 10 tijesta ponavljaju se u JPS-u (JOPS u sekundi je broj zadataka koji jednostavno primaju argumente i daju podatke u sekundi).

Automatski odabrano proširenje za rad sa utičnicama. Ako je dostupan, a zatim se koristi ekstenzije utičnice.Što čini poboljšanje performansi. Inače uključeni potok.

U djetetu su svi dostupni signali slušali. Prema zadanim postavkama, svi (osim Sigwinch-a i Siginfo) završetka rada. Ali lako može nadjačati kreiranjem metode s imenom signala u razredu protoka. Na primjer Sigwinch.

U roditeljskom procesu svi signali također se pokupljaju prema zadanim postavkama. To se može promijeniti postavljanjem Parametra listenSasterignals na razredu lažno. U ovom slučaju će se obraditi samo SigChld. Možete lako dodati svoje rukovodioce stvaranjem statičke metode koja se zove m<имя сигнала> . Na primjer, Msigterm.

Ako je dijete dizajnirano iz bilo kojeg razloga, klasa se automatski vozi kada se pokrene novi zadatak. To se neprimetno događa i ne možete uopšte razmišljati o tome. Samo instance ne trebaju ponovo posjedovati u slučaju bilo kakve pogreške.

Dječji proces s vremena na vrijeme provjerava postojanje roditelja. Ako iznenada umre, kćer će se završiti.

Svi resursi koji koriste potok ili bazen niti automatski se čiste kada se naziva destruktor. Ali mogu se očistiti prisiljeni ako nazovete metodu čišćenja. U ovom slučaju protok / bazen se više ne može koristiti.

Sa standardnim podešavanjima protok se inicijalizira unaprijed, odmah prilikom kreiranja klase. Ako postavite predproizvjednički parametar lažno, vilica će se pojaviti samo u trenutku pokretanja zadatka.

Općenito, postoji prilično nekoliko prilagođenih parametara. Promjena imena dječijeg procesa nakon FORKA (PNAME parametra dizajnera), istek vremena u vrijeme izvršenja zadatka (istek vremena), istek vremena u maksimalnom vremenu čekanja (TIMEOUTMAXWAIT), istek vremena za vrijeme pre- Inicijalizacija (vremensko ograničenje), veličine veličine pufera čitanja utičnice (pipereadsize, pipemasterReadsize). Možete onemogućiti više zadataka za streams (multitask). U ovom slučaju, svaki put kada je zadatak završen, dječji proces će umrijeti i završiti za sljedeće lansiranje. To će primjetno smanjiti performanse.

Kodeks je prekriven testovima i dokumentovan detaljnim, koristite primjere mogu se pregledati i pokretati u datoteci primjera.php. Kompleksniji primjeri s obradom greške mogu se vidjeti u jediničnom testnom kodu.

Postoji režim pogrešaka koji prikazuje vrlo detaljne informacije o tome šta se tačno događa.

Primjeri upotrebe

Glavna karakteristika je maksimalna jednostavnost. Ako želite samo nešto pokrenuti u zasebnom "potoku" dovoljno sljedećeg koda:

Ispitivanje klase Proširenje navoja (Proces zaštićenog funkcije () (// Neki posao ovdje)) $ Thread \u003d Novi ispit (); $ Nit-\u003e čekati () -\u003e pokretanje ();

Ako postoji sve što vam je potrebno za punopravni rad, tada će zadatak biti asinkrono. Ako ne, sve će i dalje raditi, ali u sinkronom režimu.

Pomoću prijenosa parametra i dobijanjem rezultata, kôd će izgledati samo malo složenije:

Class ExcestHread Proširi navoj (Proces zaštićenog funkcioniranja () (Povratak $ this-\u003e getparam (0);)) $ Thread \u003d Novi ispit (); $ navoj-\u003e čekati () -\u003e Run (123); $ Rezultat \u003d $ Navoj-\u003e Čekaj () -\u003e GetResult ();

Slično tome, jednostavna ručna maunt, dodajte obradu događaja iz potoka:

Ispitivanje klase Proširenje navoda (CONST EV_PROCESS \u003d "Proces"; Proces zaštićenog funkcije () ($ Događaji \u003d $ this-\u003e getparam (0); za (1 :: ev_process, $ ev_data); ))) // Dodatni argument. $ AllagelGument \u003d 123; $ Thread-\u003e vezati (ispiranje :: EV_Process, funkcija ($ Event_name, $ Event_DATA, $ weat_ARG) (// Obrada događaja), $ AUTALLICHURGE); $ Događaji \u003d 10; // broj događaja koji će generirati potok // Da ne biste čekali da tok prije prvog poziva // možete prebaciti svojstvo prednačenog mozga istiniti u navoj CASE $ -\u003e Čekaj (); $ Thread \u003d novi ispit (); $ Thread-\u003e Run ($ događaji) -\u003e pričekajte ();

I na kraju, upotreba bazena osam protoka s obradom greške u Runtime:

$ Threads \u003d 8 // Broj potoka $ Pool \u003d Novi temeljit ("Ispitivanje ispitivanja", $ niti); $ num \u003d 25; // Broj zadataka $ lijevo \u003d $ Num; // Broj preostalih zadataka (// ako u bazenu ima besplatni potoci // imamo zadatke za pokretanje dok ($ bazen-\u003e HASPWiting () && $ lijevo\u003e 0) (// Kada pokrenete $ ThreaDid Id \u003d $ Basel-\u003e Run (); $ lijevo--;) Ako ($ Rezultati \u003d $ Basel-\u003e Čekaj ($ nije uspjelo)) (foreach ($ Rezultati kao $ ThreaD \u003d\u003e $ Rezultat) ($ rezultat) (// uspješno završeno) zadatak // Rezultat se može identificirati // po ID-u navoj ($ Thread) $ num--;)) ako ($ neuspjeh) (// pogreške obrade greške u obradi. // Rad se smatra potpunim neuspjehom // Ako je dijete umrlo tijekom izvršenja ili // istekao istek vremena na izvršenju zadatka foreach ($ nije uspio kao $ ThreaDid) ($ lijevo ++;))) dok ($ num\u003e 0); // Dovršite sve podružnice. Očistite resurse koje koriste bazen. $ Bazen-\u003e čišćenje ();

Rezultati ispitivanja performansi

Testovi su započeli na dvije mašine sa Ubuntu 11.04.
Prvo - Intel Core i3 540 3,07 GHz.
Drugi - Intel Core i7 2600K 3,40 GHz (Ubuntu je na VMware virtualnom).

Rezultati Donosim samo da možete procijeniti rast performansi. Opet su to prosječni rezultati za seriju od 10 tijesta ponavljanja u JPS-u (poslovi u sekundi - broj zadataka u sekundi).

Kao zadatak, tokovi se izvode sljedećim smećem:

Za ($ i \u003d 0; $ i

Prvi rezultat je naveden za sinkroni način rada (bez viljuška). 18 i 20 niti na prvoj konfiguraciji nisam pokušao, jer je već za 12 bilo pad performansi.

Broj potoka Prva konfiguracija Sekunda
0 553 763
1 330 669
2 580 1254
4 1015 2188
8 1040 2618
10 1027 2719
12 970 2739
16 958 2904
18 - 2830
20 - 2730

To jest, produktivnost se diže 2-4 puta ili više ovisno o procesoru!

Kodeks koji vrši niz testova sa željenim parametrima nalazi se u primjerima / SPEED_TEST.php datoteci. Tako možete lako testirati performanse i odabrati optimalni broj potoka.

Bit ću vrlo sretan ako je biblioteka bilo kome korisno. Sve funkcije ili otkrivene greške mogu se ostaviti na Gitabe, brzo ću popraviti i poboljšati biblioteku.

Izgleda da su programeri PHP-a rijetko koriste paralelizam. Nećemo govoriti o jednostavnosti sinkronog koda, naravno, jednostavnije i jasnije, ali ponekad mala upotreba paralelizma može donijeti opipljiv porast produktivnosti.

U ovom smo članku pogledamo kako se multithreading može postići u PHP koristeći ekspanziju pthreads. Ovo će zahtijevati instalirane ZTS-a (ZED CHREACT) verzija PHP 7.x, zajedno s instaliranim širenjem pthreads v3. (U vrijeme pisanja člana, u PHP 7.1 korisnicima će se morati instalirati iz glavne grane u spremištu pthreads - pogledajte širenje treće strane.)

Mali profinjenost: Pthreads V2 dizajniran je za PHP 5.x i više nije podržan, pthreads v3 - za PHP 7.x i aktivno razvija.

Nakon takvog povlačenja, idemo odmah do poenta!

Obrada jednokratnih zadataka

Ponekad želite obraditi jednokratne zadatke sa višestrukim metodom (na primjer, izvršenje određenog zadatka vezanog za ulaz-izlaz). U takvim slučajevima možete koristiti klasu navoja da biste stvorili novu nit i pokrenute neku obradu u zasebnom toku.

Na primjer:

$ Zadatak \u003d Nova klasa proširuje navoj (privatni $ odgovor; javna funkcija pokreće () ($ sadržaj \u003d file_get_contents ("http://google.com"); preg_match ("~ (.+)~ ", $ Sadržaj, $ mečevi); $ this-\u003e Odgovor \u003d $ mečevi;)); $ zadatak-\u003e start () && $ zadatak-\u003e Pridružite se (); var_dump ($ zadatak-\u003e odgovor); // (6) "Google"

Ovdje je metoda pokretanja naša obrada koja će se izvoditi unutar novog protoka. Prilikom poziva navoja :: Počnite, generira se novi protok i poziva se metoda pokretanja. Tada se stvorila napravljena navoja na glavnu navoj, navodni navoj: Pridružite se, koji će biti blokiran dok generirana nit ne dovrši svoje izvršenje. To osigurava da će zadatak izvršiti izvršenje prije nego što pokušamo izlaziti rezultat (koji se pohranjuje u $ zadatak-\u003e odgovor).

Možda neće biti preporučljivo zagaditi razred dodatne odgovornosti povezane sa logikom protoka (uključujući odgovornost određivanja metode rada). Možemo istaknuti takve klase koji nas naslijeđuju iz klase navoja. Tada se mogu lansirati unutar drugog streama:

Radni zadatak proširuje navoj (javni $ odgovor; javna funkcija Nekowork () ($ sadržaj \u003d file_get_contents ("http://gooogle.com"); preg_match ("~ (. +) ~", $ Sadržaj, $ mečeva); $ Ovo-\u003e odgovor \u003d $ mečevi;)) $ zadatak \u003d novi zadatak; $ Thread \u003d Nova klasa ($ Zadatak) Proširi navoj (privatni $ zadatak; javna funkcija __construct (navojni $ zadatak) ($ this-\u003e zadatak \u003d $ zadatak () ($ this-\u003e zadatak-\u003e Nekework ($ this-\u003e zadatak-\u003e );)); $ Thread-\u003e Start () && $ navoj-\u003e Pridružite se (); Var_dump ($ zadatak-\u003e odgovor);

Bilo koja nastava koja će biti pokrenuta u zasebnom toku, treba Nasljed iz klase navoje. To je zato što pruža potrebne mogućnosti za obradu u različitim potocima, kao i implicitnim sigurnosnim i korisnim sučeljima (poput sinkronizacije resursa).

Pogledajmo hijerarhiju klase koje nudi širenje pthreta:

Navoj (implementira se prevrtanje, kolekcionar)

Već smo razmotrili i saznali temelje klase niti i navoja, sada pogledamo ostala tri (radnik, isparljive i bazen).

Pereppost streaming

Pokretanje novog toka za svaki zadatak koji želite paralelatima prilično je skupa. To je zato što arhitektura "ništa uobičajene" ne treba provesti u pthreadsu za postizanje multithreading unutar PHP-a. Što znači da se cijeli kontekst obavljanja trenutne instancije prevoditelja PHP-a (uključujući svaku klasu, sučelje, osobinu i funkciju) mora biti kopiran za svaki kreirani tok. Budući da podrazumijeva uočljiv učinak na performanse, tok treba uvijek biti ponovo korišten kada je moguće. Teme se mogu rezervirati na dva načina: koristeći radnika ili sa bazenom.

Radnička klasa koristi se za izvedbu brojnih zadataka sinkrono unutar drugog potoka. To se vrši stvaranjem novog instanca radnika (što stvara novi tok), a zatim dodajte zadatke u snop ovog pojedinačnog potoka (koristeći radnika :: hrpe).

Evo malog primjera:

Radni zadatak proširuje navoj (privatna $ vrijednost; javna funkcija __construct (INT $ i) ($ this-\u003e vrijednost \u003d $ I;) Javna funkcija Run () (u suppu); ($ this-\u003e vrijednost) \\ n ";) $ radnik \u003d novi radnik (); $ Radni radnik-\u003e Početak (); za ($ i \u003d 0; $ i stack (novi zadatak ($ \u200b\u200bi));) dok ($ radnier-\u003e skuplja ()); $ Radler-\u003e Isključivanje ();

U gornjem primjeru uneseno je 15 zadataka za novi $ radni objekt putem radnika :: Metoda snopa, a zatim se obrađuju redom njihove primjene. Radnik :: Prikupljanje metode, kao što je prikazano gore, koristi se za čišćenje zadataka čim završe izvršenje. S njim u vrijeme ciklusa blokiramo glavni tok dok se ne ispune svi zadaci iz snopa i dok se ne očiste - prije nego što nazovemo radnika :: gašenje. Završetak radnika -a unaprijed (i.e. do sada ima više zadataka) i dalje će blokirati glavni tok dok svi zadaci ne završe izvršenje, samo zadaci neće čistiti sakupljač smeća (koji se odnosi na sakupljač smeća cure).

Radnička klasa pruža nekoliko drugih metoda vezanih za njegovu zadatak, uključujući radnika :: Nekraća za uklanjanje najnovijeg zadatka i radnika: GetStack da biste dobili broj zadataka u snopu pogubljenja. Radnik -a stack sadrži samo zadatke koji se moraju izvršiti. Jednom kada se izvede zadatak iz snopa, on se uklanja i postavlja u zaseban (unutarnji) snop za sastavljanje smeća (koristeći radnika :: Prikupite metodu).

Drugi način za ponovno korištenje protoka prilikom obavljanja mnogih zadataka je upotreba protočnog bazena (kroz klasu bazena). Streami bazena koristi radnu grupu za omogućavanje zadataka u isto vrijemeU kojem paralelnom faktoru (broj potoka u bazenu s kojima se radi) postavlja se prilikom stvaranja bazena.

Prilagodimo gornji primjer za upotrebu radnika Pule:

Radni zadatak proširuje navoj (privatna $ vrijednost; javna funkcija __construct (INT $ i) ($ this-\u003e vrijednost \u003d $ I;) Javna funkcija Run () (u suppu); ($ this-\u003e vrijednost) \\ n ";) $ bazen \u003d novi bazen (4); za ($ i \u003d 0; $ i pošalji (novi zadatak ($ \u200b\u200bi));) dok ($ bazen-\u003e skuplja ()); $ Basel-\u003e Isključivanje ();

Postoji nekoliko primjedljivog razlika u korištenju bazena, za razliku od vorkera. Prvo, bazen ne zahtijeva ručno pokretanje, započinje obavljati zadatke čim postanu dostupne. Drugo, mi pošalji Zadaci u bazenu, ne stavili smo ih na hrpu. Pored toga, klasa bazena nije naslijeđena od navoja, pa se zbog toga ne može prenijeti u druge potoke (za razliku od radnika).

kako dobra praksaZa budi i bazene, uvijek biste trebali očistiti zadatke čim su ih završili, a zatim ih ručno ispunite. Teme stvorene pomoću klase navoja također bi trebale biti pričvršćene na stvaranje struje.

pthreads i (ne) varijabilnost

Posljednji razred mi ćemo dodirnuti - isparljive, - novi dodatak pthredsu v3. Koncept nepromijenjenog postao je važan koncept u pthreadsu, jer je značajno smanjen bez njega. Stoga su, prema zadanim postavkama, svojstva navojanih klasa, koja su sama namijenjene predmete, sada su nepromijenjene, a zato ih ne mogu prebrisati nakon njihovog početnog zadatka. Eksplicitna varijabilnost za takva svojstva je sada poželjnija, a još uvijek se može postići novom isparljivom razredom.

Pogledajmo primjer koji će demonstrirati nova ograničenja ograničenja:

Klasni zadatak proširuje navojnu klasu // navojna klasa ($ this-\u003e podaci \u003d novi navoj (); // $ this-\u003e podaci nisu premješteni, jer je to navojna imovina navoja klase) $ zadatak \u003d nova klasa (nova klasa (nova klasa) Zadatak ()) produžava navoj (// navojna klasa, jer se navoja produžava na navojnoj javnoj funkciji __construct ($ tm) ($ th-\u003e snimljenoMember \u003d $ tm; var_dump ($ this-\u003e threedtemmber-\u003e podaci); // objekt ( Navojno) # 3 (0) () $ this-\u003e snimljenMember \u003d novi stdclass (); // nevažeći, budući da je nekretnina navojni član klase navoja);

Navojnim softverom na časovima Voćnice, s druge strane, promjenjivim:

Radni zadatak proširuje volatilne (javne funkcije __construct () ($ this-\u003e podaci \u003d novi navoj (); $ this-\u003e podaci \u003d novi stdclass (); // valjana, jer smo u isparljivoj klasi) $ zadatak \u003d novi Klasa (novi zadatak ()) produžava navoj ($ VM) ($ this-\u003e volatileMember \u003d $ vm; var_dump ($ this-\u003e VoltileMember-\u003e podaci); // objekt (STDClass) # 4 (0) () /// Još uvijek nevažeći, jer se Voltole produžava navojno, pa je nekretnina još uvijek navodni član navoja the the the thing this-\u003e volatileMember \u003d novi stdclass (););

Vidimo da isparljive klase redefinira nepromjenjivost nametnutu navoju roditeljske klase kako bi se omogućila mogućnost promjene navoja na navojnim uređajima (kao i nepravedni ().

Postoji još jedan predmet rasprave za otkrivanje teme varijabilnosti i klase isparljivo - nizova. U pthreadsu se niz automatski pružaju isparljivim objektima prilikom dodjele nekretnina navoja. To je zato što je jednostavno nesigurno manipulirati nizom nekoliko php konteksta.

Pogledajmo ponovo na primjer, da bolje razumijemo neke stvari:

$ array \u003d; $ Zadatak \u003d Nova klasa ($ araj) proširuje navoj (privatni $ podaci; javna funkcija __construct (array $ marta) ($ this-\u003e podaci \u003d $ araj;) Run () ($ this-\u003e podaci \u003d 4; $ this-\u003e podaci \u003d 5; print_r ($ this-\u003e podaci);)); $ Zadatak-\u003e Start () && $ zadatak-\u003e Pridružite se (); / * Zaključak: isparljivi objekt (\u003d\u003e 1 \u003d\u003e 2 \u003d\u003e 3 \u003d\u003e 4 \u003d\u003e 5) * /

Vidimo da se isparljivi objekti mogu obraditi kao da su porođaji, jer podržavaju operacije sa nizovima, poput (kao što je prikazano gore) operator (). Međutim, časove voltola ne podržavaju osnovne funkcije sa nizovima, poput array_pop i array_shift. Umjesto toga, klasa navoja pruža nam takve operacije kao ugrađene metode.

Kao demonstracija:

$ Podaci \u003d Nova klasa proširuje volatilne (javno $ a \u003d 1; javna $ b \u003d 2; javna $ c \u003d 3;); Var_dump ($ podaci); Var_dump ($ podaci-\u003e pop ()); Var_dump ($ podaci-\u003e pomak ()); Var_dump ($ podaci); / * Izlaz: objekt ( [Zaštićen e-poštom]) # 1 (3) (["a"] \u003d\u003e int (1) ["b"] \u003d\u003e int (2) ["c"] \u003d\u003e int (3)) int (3) int (1) objekt ( [Zaštićen e-poštom]) # 1 (1) (["b"] \u003d\u003e int (2)) * /

Ostale podržane operacije uključuju navojne :: Chunk i navojni :: Spajanje.

Sinhronizacija

U posljednjem dijelu ovog članka razmotrit ćemo sinhronizaciju u pthretsu. Sinhronizacija je metoda koja vam omogućuje kontrolu pristupa zajedničkim resursima.

Na primjer, prodajmo najjednostavniji brojač:

$ Counter \u003d Nova klasa proširuje navoj (javno $ I \u003d 0; javna funkcija pokreće () (za ($ i \u003d 0; $ I I;)); $ Counter-\u003e start (); za ($ i \u003d 0; $ i i;) $ counter-\u003e pridruži se (); Var_dump ($ counter-\u003e i); // povučen sa 10 do 20

Bez upotrebe sinhronizacije, izlaz nije determiniran. Nekoliko niti napisano je u jednoj varijabli bez kontroliranog pristupa, što znači da će se ažuriranja izgubiti.

Popravimo to tako da dobijemo tačan izlaz 20 dodavanjem sinkronizacije:

$ Counter \u003d Nova klasa proširuje navoj (javno $ i \u003d 0; javna funkcija pokreće () ($ this-\u003e sinhronizirano (funkcija () (za ($ i \u003d 0; $ I I;));)); $ Counter-\u003e start (); $ Counter-\u003e sinhroniziran (funkcija ($ brojač) (za ($ i \u003d 0; $ i i;)), $ brojač); $ Counter-\u003e Pridružite se (); Var_dump ($ counter-\u003e i); // int (20)

Sinhronizirani kodni blokovi mogu se međusobno komunicirati, koristeći navojni navojni: čekanje i navojno sredstvo :: Obavijesti (ili navojni :: Obavijesti).

Evo hitnog prirasta u dva sinkronizirana dok se ciklusi:

$ Counter \u003d Nova klasa proširuje navoj (javno $ COND \u003d 1; javna funkcija pokreće () ($ this-\u003e sinhronizirano (funkcija () (za ($ i \u003d 0; $ ja obavijestiti (); ako ($ this-\u003e cond \u003d\u003d\u003d 1) ($ this-\u003e cond \u003d 2; $ this-\u003e čekaj ();)));)); $ Counter-\u003e start (); $ Counter-\u003e sinhroniziran (funkcija ($ brojač) (ako ($ countra-\u003e cond! \u003d\u003d 2) ($ counter-\u003e čekaj (); // za Drugi za početak) za ($ i \u003d 10; $ ja obavijestiti (); ako ($ counter-\u003e cond \u003d\u003d\u003d 2) ($ counter-\u003e Contra-\u003e Čekaj ();)) , $ brojač); $ Counter-\u003e Pridružite se (); / * Zaključak: 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 (19) * /

Možete primijetiti dodatni uslovikoji su bili stavljeni oko žalbe na navojnu: čekanje. Ovi su uvjeti ključni jer omogućavaju sinhronizirani Columus za nastavak rada kada je primio obavijest, a navedeni uvjet je istinit. Ovo je važno jer obavijesti mogu doći s drugih mjesta, osim prilikom pozivanja navoja :: Obavijesti. Dakle, ako navojni navodni :: Metoda čekanja nisu bili priloženi u uvjetima, nastupit ćemo lažni pozivi Budući seTo će dovesti do nepredvidivog ponašanja koda.

Zaključak

Pregledali smo pet časova paketa pthreads (navojni, navoj, radnika, voltoli i bazen), kao i svaka od korištenih klasa. I pogledali smo i novi koncept besprijekornog u pthremeu kratak pregled Podržane mogućnosti sinhronizacije. Ovim osnovama sada možemo nastaviti s obzirom na razmatranje aplikacija pthreads u slučajevima iz stvarnog svijeta! Ovo će biti tema našeg sledećeg posta.

Ako ste zainteresirani za prijenos sljedećeg posta, javite mi: Komentar u društvenim. Mreže, plus i dijeli post sa kolegama i prijateljima.

Učitavanje ...Učitavanje ...