19.09.2024
Rumah / Internet / Thread diskusi anemia php. Komputasi multithread di PHP: pthreads. Apa itu pthread

Thread diskusi anemia php. Komputasi multithread di PHP: pthreads. Apa itu pthread

Tampaknya pengembang PHP jarang menggunakan konkurensi. Saya tidak akan berbicara tentang kesederhanaan kode sinkron, tentu saja, lebih sederhana dan jelas, tetapi terkadang penggunaan kecil paralelisme dapat membawa peningkatan kinerja yang signifikan.

Pada artikel ini, kita akan melihat bagaimana multithreading dapat dicapai di PHP menggunakan ekstensi pthreads. Untuk melakukan ini, Anda perlu menginstal PHP 7.x versi ZTS (Zend Thread Safety), bersama dengan ekstensi terpasang pthread v3. (Pada saat penulisan, di PHP 7.1, pengguna perlu menginstal dari cabang master di repositori pthreads - lihat ekstensi pihak ketiga.)

Klarifikasi kecil: pthreads v2 ditujukan untuk PHP 5.x dan tidak lagi didukung, pthreads v3 untuk PHP 7.x dan sedang dikembangkan secara aktif.

Setelah penyimpangan seperti itu, mari langsung ke intinya!

Memproses tugas satu kali

Terkadang Anda ingin memproses tugas satu kali dengan cara multi-thread (misalnya, menjalankan beberapa tugas yang terikat I/O). Dalam kasus seperti ini, Anda dapat menggunakan kelas Thread untuk membuat thread baru dan menjalankan beberapa pemrosesan pada thread terpisah.

Misalnya:

$tugas = perluasan kelas baru Thread ( private $response; public function run() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+)~", $content, $matches); $this->response = $matches; ) ); $task->start() && $task->join(); var_dump($task->response); // string (6) "Google"

Di sini metode run adalah pemrosesan kami, yang akan dieksekusi di dalam thread baru. Ketika Thread::start dipanggil, thread baru muncul dan metode run dipanggil. Kami kemudian menggabungkan thread anak kembali ke thread utama dengan memanggil Thread::join , yang akan memblokir hingga thread anak selesai dieksekusi. Ini memastikan bahwa tugas selesai dijalankan sebelum kita mencoba mencetak hasilnya (yang disimpan di $task->response).

Mungkin tidak diinginkan untuk mencemari kelas dengan tanggung jawab tambahan yang terkait dengan logika aliran (termasuk tanggung jawab untuk mendefinisikan metode yang dijalankan). Kita dapat membedakan kelas-kelas tersebut dengan mewarisinya dari kelas Threaded. Kemudian mereka dapat dijalankan di dalam thread lain:

Tugas Kelas meluas Berulir ( public $response; public function someWork() ( $content = file_get_contents("http://google.com"); preg_match("~ (.+) ~", $content, $matches); $ ini->respon = $cocok; ) ) $tugas = Tugas baru; $thread = kelas baru($task) extends Thread ( private $task; public function __construct(Threaded $task) ( $this->task = $task; ) public function run() ( $this->task->someWork( ); $utas->mulai() && $utas->gabung(); var_dump($tugas->respon);

Kelas apa pun yang perlu dijalankan di thread terpisah harus mewarisi dari kelas Threaded. Hal ini karena menyediakan kemampuan yang diperlukan untuk melakukan pemrosesan pada thread yang berbeda, serta keamanan implisit dan antarmuka yang berguna (seperti sinkronisasi sumber daya).

Mari kita lihat hierarki kelas yang ditawarkan oleh ekstensi pthreads:

Kumpulan Volatile Pekerja Thread yang Dapat Dilintasi dan Dapat Dikoleksi

Kita telah membahas dan mempelajari dasar-dasar kelas Thread dan Threaded, sekarang mari kita lihat tiga kelas lainnya (Worker, Volatile, dan Pool).

Menggunakan kembali Thread

Memulai thread baru untuk setiap tugas yang perlu diparalelkan cukup mahal. Ini karena arsitektur common-nothing harus diimplementasikan di pthreads untuk mencapai multithreading dalam PHP. Artinya, seluruh konteks eksekusi instance penerjemah PHP saat ini (termasuk setiap kelas, antarmuka, sifat, dan fungsi) harus disalin untuk setiap thread yang dibuat. Karena hal ini memiliki dampak kinerja yang nyata, streaming harus selalu digunakan kembali bila memungkinkan. Thread dapat digunakan kembali dengan dua cara: menggunakan Workers atau menggunakan Pools.

Kelas Worker digunakan untuk melakukan sejumlah tugas secara sinkron dalam thread lain. Hal ini dilakukan dengan membuat instance Worker baru (yang membuat thread baru), lalu memasukkan tugas ke tumpukan thread terpisah tersebut (menggunakan Worker::stack).

Berikut ini contoh kecilnya:

Tugas Kelas meluas Berulir ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Tugas: ($this->value) \n"; ) ) $pekerja = Pekerja baru(); $pekerja->mulai(); for ($i = 0; $i stack(Tugas baru($i)); ) while ($pekerja->mengumpulkan()); $pekerja->shutdown();

Dalam contoh di atas, 15 tugas untuk objek $worker baru dimasukkan ke dalam tumpukan melalui metode Worker::stack, lalu tugas tersebut diproses sesuai urutan pengirimannya. Metode Worker::collect, seperti yang ditunjukkan di atas, digunakan untuk membersihkan tugas segera setelah selesai dijalankan. Dengan itu, di dalam loop while, kita memblokir thread utama hingga semua tugas di tumpukan selesai dan dibersihkan - sebelum kita memanggil Worker::shutdown . Menghentikan pekerja lebih awal (yaitu ketika masih ada tugas yang harus diselesaikan) masih akan memblokir thread utama hingga semua tugas telah menyelesaikan eksekusinya, hanya saja tugas tersebut tidak akan dikumpulkan sebagai sampah (yang berarti kebocoran memori).

Kelas Worker menyediakan beberapa metode lain yang terkait dengan tumpukan tugasnya, termasuk Worker::unstack untuk menghapus tumpukan tugas terakhir dan Worker::getStacked untuk mendapatkan jumlah tugas dalam tumpukan eksekusi. Tumpukan pekerja hanya berisi tugas-tugas yang perlu dijalankan. Setelah tugas di tumpukan selesai, tugas tersebut dihapus dan ditempatkan di tumpukan (internal) terpisah untuk pengumpulan sampah (menggunakan metode Worker::collect).

Cara lain untuk menggunakan kembali thread di beberapa tugas adalah dengan menggunakan kumpulan thread (melalui kelas Pool). Kumpulan thread menggunakan sekelompok Pekerja untuk memungkinkan tugas dieksekusi serentak, di mana faktor konkurensi (jumlah thread kumpulan yang dioperasikannya) diatur saat kumpulan dibuat.

Mari kita sesuaikan contoh di atas untuk menggunakan kumpulan pekerja:

Tugas Kelas meluas Berulir ( private $value; public function __construct(int $i) ( $this->value = $i; ) public function run() ( usleep(250000); echo "Tugas: ($this->value) \n"; ) ) $kumpulan = Kumpulan baru(4); for ($i = 0; $i submit(Tugas baru($i)); ) while ($pool->collect()); $pool->shutdown();

Ada beberapa perbedaan penting saat menggunakan kolam dibandingkan dengan pekerja. Pertama, kumpulan tidak perlu dimulai secara manual; kumpulan tersebut mulai menjalankan tugas segera setelah tersedia. Kedua, kita mengirim tugas ke kolam renang, tidak menaruhnya di tumpukan. Selain itu, kelas Pool tidak mewarisi dari Threaded dan oleh karena itu tidak dapat diteruskan ke thread lain (tidak seperti Worker).

Merupakan praktik yang baik bagi pekerja dan kumpulan untuk selalu membereskan tugas mereka segera setelah selesai, dan kemudian menghentikannya sendiri secara manual. Thread yang dibuat menggunakan kelas Thread juga harus dilampirkan ke thread induk.

pthreads dan (im) mutabilitas

Kelas terakhir yang akan kita bahas adalah Volatile, tambahan baru pada pthreads v3. Kekekalan telah menjadi konsep penting dalam pthreads karena tanpanya, kinerja akan menurun secara signifikan. Oleh karena itu, secara default, properti kelas Berulir yang merupakan objek Berulir sekarang tidak dapat diubah, dan oleh karena itu properti tersebut tidak dapat ditimpa setelah penugasan awalnya. Mutabilitas eksplisit untuk properti tersebut saat ini lebih disukai, dan masih dapat dicapai dengan menggunakan kelas Volatile yang baru.

Mari kita lihat contoh yang akan menunjukkan batasan kekekalan yang baru:

Tugas Kelas memperluas Threaded // kelas Threaded ( fungsi publik __construct() ( $this->data = new Threaded(); // $this->data tidak dapat ditimpa, karena ini adalah properti Threaded dari kelas Threaded ) ) $tugas = kelas baru(Tugas baru()) memperluas Thread ( // kelas Berulir, karena Thread memperluas fungsi publik Berulir __construct($tm) ( $this->threadedMember = $tm; var_dump($this->threadedMember-> data); // objek(Berulir)#3 (0) () $this->threadedMember = new StdClass(); // tidak valid, karena properti adalah anggota Berulir dari kelas Berulir ) );

Sebaliknya, properti berulir dari kelas Volatile dapat berubah:

Tugas Kelas meluas Volatile ( public function __construct() ( $this->data = new Threaded(); $this->data = new StdClass(); // valid, karena kita berada di kelas yang mudah menguap ) ) $task = new class(Tugas baru()) extends Thread ( public function __construct($vm) ( $this->volatileMember = $vm; var_dump($this->volatileMember->data); // objek(stdClass)#4 (0) () // masih tidak valid, karena Volatile merupakan perluasan dari Threaded, sehingga properti tersebut masih merupakan anggota Threaded dari kelas Threaded $this->volatileMember = new StdClass() );

Kita dapat melihat bahwa kelas Volatile mengesampingkan kekekalan yang diberlakukan oleh kelas Threaded induknya untuk memberikan kemampuan untuk mengubah properti Threaded (serta unset() properti tersebut).

Ada topik diskusi lain yang membahas topik variabilitas dan kelas Volatile - array. Di pthreads, array secara otomatis dilemparkan ke objek Volatile ketika ditugaskan ke properti kelas Threaded. Hal ini karena tidak aman untuk memanipulasi array dengan beberapa konteks PHP.

Mari kita lihat contohnya lagi untuk memahami beberapa hal dengan lebih baik:

$array = ; $tugas = kelas baru($array) extends Thread ( private $data; public function __construct(array $array) ( $this->data = $array; ) public function run() ( $this->data = 4; $ ini->data = 5; print_r($ini->data) ); $tugas->mulai() && $tugas->gabung(); /* Keluaran: Objek Volatil ( => 1 => 2 => 3 => 4 => 5) */

Kita melihat bahwa objek Volatile dapat diperlakukan seolah-olah mereka adalah array karena mereka mendukung operasi array seperti (seperti yang ditunjukkan di atas) operator subset(). Namun, kelas Volatile tidak mendukung fungsi array dasar seperti array_pop dan array_shift. Sebaliknya, kelas Threaded memberi kita operasi seperti metode bawaan.

Sebagai demonstrasi:

$data = kelas baru diperluas Volatile ( public $a = 1; public $b = 2; public $c = 3; ); var_dump($data); var_dump($data->pop()); var_dump($data->shift()); var_dump($data); /* Keluaran: objek(kelas@anonim)#1 (3) ( ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ) int(3) int(1) objek(kelas@anonim)#1 (1) ( ["b"]=> int(2) ) */

Operasi lain yang didukung termasuk Threaded::chunk dan Threaded::merge .

Sinkronisasi

Di bagian terakhir artikel ini, kita akan melihat sinkronisasi di pthreads. Sinkronisasi adalah metode yang memungkinkan Anda mengontrol akses ke sumber daya bersama.

Sebagai contoh, mari kita terapkan penghitung sederhana:

$counter = kelas baru extends Thread ( public $i = 0; public function run() ( for ($i = 0; $i i; ) ) ); $counter->mulai(); untuk ($i = 0; $i i; ) $counter->join(); var_dump($penghitung->i); // akan mencetak angka dari 10 hingga 20

Tanpa penggunaan sinkronisasi, keluarannya tidak bersifat deterministik. Beberapa thread menulis ke variabel yang sama tanpa akses terkontrol, yang berarti pembaruan akan hilang.

Mari kita perbaiki sehingga kita mendapatkan keluaran 20 yang benar dengan menambahkan waktu:

$counter = kelas baru extends Thread ( public $i = 0; public function run() ( $this->synchronized(function () ( for ($i = 0; $i i; ) )); ) ); $counter->mulai(); $counter->disinkronkan(fungsi ($counter) ( untuk ($i = 0; $i i; ) ), $counter); $counter->gabung(); var_dump($penghitung->i); // ke dalam(20)

Blok kode yang disinkronkan juga dapat berkomunikasi satu sama lain menggunakan metode Threaded::wait dan Threaded::notify (atau Threaded::notifyAll).

Berikut adalah kenaikan alternatif dalam dua perulangan while yang disinkronkan:

$counter = perluasan kelas baru Thread ( public $cond = 1; public function run() ( $this->synchronized(function () ( for ($i = 0; $i notify(); if ($this->cond === 1) ( $ini->lanjutan = 2; $ini->tunggu(); ) ) )); $counter->mulai(); $counter->synchronized(function ($counter) ( if ($counter->cond !== 2) ( $counter->wait(); // menunggu yang lain memulai terlebih dahulu ) for ($i = 10; $i memberitahu(); jika ($counter->cond === 2) ( $counter->cond = 1; $counter->wait(); ) ) ), $counter); $counter->gabung(); /* Keluaran: int(0) int(10) int(1) int(11) int(2) int(12) int(3) int(13) int(4) int(14) int(5) int( 15) ke dalam(6) ke dalam(16) ke dalam(7) ke dalam(17) ke dalam(8) ke dalam(18) ke dalam(9) ke dalam(19) */

Anda mungkin memperhatikan ketentuan tambahan yang diterapkan pada panggilan ke Threaded::wait . Kondisi ini sangat penting karena memungkinkan panggilan balik yang disinkronkan dilanjutkan ketika sudah menerima pemberitahuan dan kondisi yang ditentukan benar. Hal ini penting karena notifikasi bisa datang dari tempat lain selain saat Threaded::notify dipanggil. Jadi, jika panggilan ke metode Threaded::wait tidak disertakan dalam kondisi, kami akan mengeksekusi panggilan bangun palsu, yang akan menyebabkan perilaku kode yang tidak dapat diprediksi.

Kesimpulan

Kami melihat lima kelas paket pthreads (Threaded, Thread, Worker, Volatile, dan Pool) dan bagaimana setiap kelas digunakan. Kami juga melihat konsep baru tentang kekekalan di pthreads yang dibuat gambaran singkat kemampuan sinkronisasi yang didukung. Dengan dasar-dasar ini, sekarang kita dapat mulai melihat bagaimana pthreads dapat digunakan dalam kasus-kasus dunia nyata! Ini akan menjadi topik postingan kami selanjutnya.

Jika Anda tertarik dengan terjemahan postingan berikutnya, beri tahu saya: beri komentar di media sosial. jaringan, upvote dan bagikan kiriman dengan kolega dan teman.

Diskusi berulir

A diskusi berulir adalah diskusi elektronik (misalnya melalui email, daftar email, papan buletin, newsgroup, atau forum Internet) di mana perangkat lunak membantu pengguna dengan mengelompokkan pesan secara visual. Pesan biasanya dikelompokkan secara visual dalam hierarki berdasarkan topik. Kumpulan pesan yang dikelompokkan sedemikian rupa disebut a topik benang atau sekadar "utas". Forum diskusi, klien email, atau klien berita dikatakan memiliki "topik berulir" jika pesan tersebut mengelompokkan topik yang sama agar mudah dibaca dengan cara ini. Selain itu, diskusi berulir biasanya memungkinkan pengguna untuk membalas posting tertentu dalam utas suatu topik. Hasilnya, terdapat hierarki diskusi dalam topik utas. Berbagai jenis perangkat lunak memungkinkan hierarki ini ditampilkan dalam apa yang ada. disebut Mode Berulir. (Alternatifnya adalah Mode Linear, yang biasanya menampilkan semua postingan dalam urutan tanggal, terlepas dari siapa yang secara spesifik membalas kepada siapa.)

Keuntungan

Keuntungan dari tampilan yang dirangkai secara hierarkis adalah memungkinkan pembaca untuk mengapresiasi dengan cepat keseluruhan struktur percakapan: khususnya siapa yang membalas kepada siapa. Oleh karena itu, hal ini sangat berguna dalam situasi dengan percakapan atau debat yang panjang, seperti newsgroup: memang, untuk debat yang sangat kompleks, akan menjadi mustahil untuk mengikuti argumen tanpa adanya sistem rangkaian hierarki.

Manfaat lainnya adalah apresiasi yang lebih halus terhadap komunitas dalam sistem yang berjenjang secara hierarki. Karena tanggapan harus diberikan pada postingan tertentu, maka tanggapan juga diberikan kepada individu tertentu. Oleh karena itu, percakapan berulir cenderung memfokuskan penulis pada pandangan dan kepribadian spesifik dari individu yang ditanggapi. Hal ini lebih jarang terjadi di forum yang komentar terbarunya baru saja dimasukkan ke dalam kumpulan umum.

Kekurangan

Kerugian dari threading hierarki dibandingkan threading datar adalah peningkatan tingkat kerumitan, dan oleh karena itu pandangan seperti itu memerlukan peningkatan tingkat kenyamanan dan kecanggihan dari pihak penggunanya. Oleh karena itu tidak mengherankan jika penggunaan paling banyak dilakukan di beberapa komunitas online tertua dan/atau tercanggih, seperti Usenet, CIX, atau Slashdot. Sebagai perbandingan, sistem obrolan web dan komentar lebih muda dan terbuka untuk khalayak yang lebih luas, sehingga threading hierarkis baru-baru ini menjadi hal yang lumrah di arena tersebut.

Menerapkan hierarki pohon juga cenderung memecah-mecah diskusi dalam suatu topik: tidak mungkin lagi memposting pesan yang menanggapi atau merangkum beberapa postingan berbeda sebelumnya. Sebaliknya, setiap postingan sebelumnya harus ditanggapi satu per satu. Dapat dikatakan bahwa hal ini mengarah pada gaya debat yang lebih konfrontatif dalam forum-forum yang menggunakan alur hierarki. Namun, meskipun hal tersebut mungkin benar, jika balasan langsung tidak lagi dapat dilakukan karena banyaknya balasan pada postingan yang diinginkan, pengguna kini sering menggunakan kutipan dari orang yang mereka tanggapi untuk menjaga percakapan tetap pada jalurnya dan mengalir. dengan lancar Hal ini direkomendasikan oleh sebagian besar komunitas papan pesan jika threading telah mencapai batas komprehensifnya.

Buka utas

Thread terbuka mengacu pada postingan blog tempat pembaca dapat berkomentar dan mendiskusikan topik apa pun yang mereka pilih. Mereka biasanya lebih berguna di blog populer dengan jumlah banyak lalu lintas; kata-kata ini sering digunakan ketika penulis blog tidak mempunyai topik untuk diposkan atau ketika ada jeda dalam pengeposan.

Open thread juga digunakan untuk memecah kebosanan postingan di halaman utama blog. Komentar mungkin menumpuk pada postingan berorientasi konten; oleh karena itu, penulis menggunakan thread terbuka sehingga waktu buka halaman tidak akan melambat.

Contoh

*Yahoo! Grup [ http://groups.yahoo.com/], Grup MSN [ http://groups.msn.com/] dan titik miring [ http://www.slashdot.com/] semuanya menawarkan forum berbasis web yang menampilkan diskusi berulir.

Lihat juga

*Penulisan Langit Ilmiah
* Daftar istilah blogging

Referensi

*mulut dart. (2003). [ http://www.dartmouth.edu/~webteach/articles/discussion.html "Mengikuti diskusi online" ]
*Wolsey, T.DeVere, [ http://www.readingonline.org/articles/art_index.asp?HREF=wolsey/index.html "Diskusi sastra di dunia maya: Remaja muda menggunakan kelompok diskusi berulir untuk membicarakan buku] . "Membaca Online", 7(4), Januari/Februari 2004. Diakses tanggal 30 Desember 2007

Yayasan Wikimedia.

  • 2010.
  • Leon Power

Barh Azum

    Lihat kamus lain: forum internet

    - Paket perangkat lunak Forum Internet phpBB, salah satu paket forum terpopuler… Wikipedia Sejarah lingkungan belajar virtual tahun 1990an

    - Dalam sejarah lingkungan pembelajaran virtual, tahun 1990an adalah masa pertumbuhan, terutama karena munculnya komputer terjangkau dan Internet.1990an1990* Formal Systems Inc. dari Princeton, NJ, AS memperkenalkan Penilaian berbasis DOS… … Wikipedia- Kolaborasi Tatap Muka Lingkungan Pendidikan Pengembang konsorsium LEAD Rilis stabil 5.0 / Juni 2010 Sistem operasi Lintas platform … Wikipedia

    Rangkaian percakapan- adalah fitur yang digunakan oleh banyak klien email, papan buletin, newsgroup, atau forum Internet di mana perangkat lunak membantu pengguna dengan mengelompokkan pesan secara visual. Pesan biasanya dikelompokkan secara visual dalam hierarki berdasarkan topik. Sekumpulan pesan yang dikelompokkan... ... Wikipedia

    titik potong- Screenshot URL halaman utama Slashdot.org Slogan Berita Slashdot.org untuk para nerd. Hal-hal yang penting...Wikipedia

    MediaWiki- namespace dialihkan ke sini. Untuk bantuan mengenai ruang nama MediaWiki di Wikipedia, lihat Bantuan:ruang nama MediaWiki. Untuk informasi umum tentang ruang nama Wikipedia, lihat Wikipedia:Ruang Nama. Halaman pembicaraan dan halaman pembicaraan MediaWiki dialihkan ke sini. Untuk... ... Wikipedia

    Komunikasi melalui komputer- Untuk kegunaan lain, lihat CMC (disambiguasi). Komunikasi yang dimediasi komputer (CMC) didefinisikan sebagai setiap transaksi komunikatif yang terjadi melalui penggunaan dua atau lebih jaringan komputer. Meskipun istilah tersebut secara tradisional mengacu pada… … Wikipedia

    Perbandingan perangkat lunak wiki- Tabel berikut membandingkan informasi umum dan teknis untuk sejumlah paket perangkat lunak wiki. Daftar Isi 1 Informasi umum 2 Target audiens 3 Fitur 1 4 Fitur 2 … Wikipedia

    Penulisan Langit Ilmiah- adalah istilah yang diciptakan oleh ilmuwan kognitif Stevan Harnad yang menggambarkan kombinasi beberapa email dan arsip web berulir topik seperti newsgroup, milis elektronik, hypermail, netnews atau forum Internet, ditautkan dan diurutkan berdasarkan tanggal,… … Wikipedia

    Perangkat lunak pengambilan keputusan kolaboratif- Perangkat lunak pengambilan keputusan kolaboratif (CDM) adalah aplikasi atau modul perangkat lunak yang mengoordinasikan fungsi dan fitur yang diperlukan untuk menghasilkan keputusan kolektif secara tepat waktu, sehingga memungkinkan semua pemangku kepentingan terkait untuk berpartisipasi dalam proses tersebut. Itu... ... Wikipedia

Saya baru-baru ini mencoba pthreads dan terkejut - ini adalah ekstensi yang menambahkan kemampuan untuk bekerja dengan banyak thread nyata di PHP. Tidak ada persaingan, tidak ada keajaiban, tidak ada kepalsuan - semuanya nyata.



Saya sedang mempertimbangkan tugas seperti itu. Ada kumpulan tugas yang harus diselesaikan dengan cepat. PHP memiliki alat lain untuk mengatasi masalah ini, tidak disebutkan di sini, artikelnya tentang pthreads.



Apa itu pthread

Itu saja! Ya, hampir semuanya. Faktanya, ada sesuatu yang mungkin membuat kesal pembaca yang penasaran. Semua ini tidak berfungsi pada PHP standar yang dikompilasi dengan opsi default. Untuk menikmati multithreading, Anda harus mengaktifkan ZTS (Zend Thread Safety) di PHP Anda.

pengaturan PHP

Selanjutnya PHP dengan ZTS. Tidak peduli dengan perbedaan waktu eksekusi yang besar dibandingkan PHP tanpa ZTS (37,65 vs 265,05 detik), saya tidak mencoba menggeneralisasi setup PHP. Dalam kasus tanpa ZTS, saya mengaktifkan XDebug misalnya.


Seperti yang Anda lihat, saat menggunakan 2 thread, kecepatan eksekusi program kira-kira 1,5 kali lebih tinggi dibandingkan dengan kode linier. Saat menggunakan 4 utas - 3 kali.


Anda dapat mencatat bahwa meskipun prosesornya 8-inti, waktu eksekusi program hampir tidak berubah jika lebih dari 4 thread digunakan. Tampaknya hal ini disebabkan oleh fakta bahwa prosesor saya memiliki 4 inti fisik. Untuk lebih jelasnya, saya telah menggambarkan pelat dalam bentuk diagram.


Melanjutkan

Di PHP, dimungkinkan untuk bekerja dengan cukup elegan dengan multithreading menggunakan ekstensi pthreads. Hal ini memberikan peningkatan produktivitas yang nyata.

Tag: Tambahkan tag

Ibu dari teman baik saya kehilangan kopernya dalam penerbangan dari St. Petersburg ke Moskow, dan dia harus penerbangan lebih lanjut ke pantai yang lebih hangat, dan sekarang dia sudah berada di resor - tanpa baju renang, sandal, dan hanya dengan T -kemeja dari tas tangannya. Demi masa lalu, saya memberinya beberapa tips tentang apa yang harus dilakukan dan ke mana harus lari, dan hari ini saya memutuskan untuk menulis semua yang saya tahu tentang topik tertentu di sini.

Untuk menjelaskan betapa pintarnya saya, izinkan saya mengingatkan Anda bahwa saya pernah bekerja di layanan darat untuk beberapa maskapai penerbangan, termasuk menangani masalah tertentu terkait pencarian bagasi. Ya, ditambah pengalaman penerbangan saya sendiri tentunya. Namun karena Saya meninggalkan industri jasa penerbangan beberapa tahun yang lalu, mungkin beberapa nuansa mungkin telah berubah - jika demikian, saya akan dengan senang hati menerima komentar tentang topik tersebut dan mengoreksi informasi di postingan.

Saya akan mulai dengan ini Yang perlu Anda lakukan agar bagasi Anda tidak hilang:
1. Sobek semua label dan stiker dari perjalanan sebelumnya dari koper Anda, bahkan yang kecil dengan kode batang, yang sering ditempel secara terpisah ke koper itu sendiri - dapat membingungkan sistem pemindaian dan penyortiran bagasi otomatis.
2. Gantungkan label nama di koper Anda (tas, kotak, paket - secara umum, semua yang Anda check-in sebagai bagasi): Anda dapat membeli opsi yang dapat digunakan kembali terlebih dahulu atau mengambil label kertas di konter check-in - biasanya semuanya maskapai penerbangan setengah layak memberikannya tanpa batasan. Dan Emirates, misalnya, umumnya memiliki label plastik bagus pada kabelnya yang tahan lama dan dapat bertahan lama:

Paranoid lama juga bisa melakukan hal yang sama seperti saya: Saya selalu memiliki label plastik yang dapat digunakan kembali dari set Samsonite yang tergantung di koper saya dengan alamat rumah permanen, nomor telepon, dan melalui email, dan ketika saya terbang ke suatu tempat untuk berlibur, saya juga menggantungkan catatan kertas yang berisi tanggal saya tinggal di tempat baru dan semua kemungkinan kontak (nama dan alamat hotel, nomor telepon lokalnya, jika ada, dan nama depan dan belakangku, tentu saja).
3. Di konter check-in, pastikan bagasi Anda dibubuhi label bagasi yang dicetak oleh agen check-in - dengan kode kota tujuan penerbangan dan nomor penerbangan.
4. Jika Anda memiliki beberapa penerbangan lanjutan, beri tahu agen check-in tentang hal ini dan tentukan di titik mana Anda ingin memeriksa bagasi Anda. Dalam beberapa kasus, bagasi harus diambil di bandara tertentu di sepanjang rute, apa pun keinginan Anda: ini berlaku, misalnya, untuk transfer antar bandara (Orly dan Charles de Gaulle di Paris, Domodedovo - Sheremetyevo - "Vnukovo " di Moskow), terminal terpisah (terminal 1 dan 2 di Frankfurt) atau di titik kedatangan pertama di AS atau Meksiko - ini adalah persyaratan bea cukai di negara-negara ini: misalkan Anda terbang Moskow-Washington-Phoenix, label bagasi dikeluarkan untuk ketiga segmen ke Phoenix, tetapi di Washington, bagasi harus diambil secara fisik, melewati bea cukai dan didaftarkan kembali juga, jika Anda check-in kereta dorong bayi yang boleh Anda bawa sebelum pesawat , atau binatang, Anda mungkin perlu mengambilnya di tempat transit. Secara umum, dalam kasus rute yang rumit dengan transfer, lebih baik untuk mengklarifikasi rincian pergerakan bagasi terlebih dahulu di pusat panggilan maskapai atau, dalam kasus ekstrim, saat check-in.
5. Jadikan bagasi Anda terlihat: keterlambatan bagasi tidak selalu merupakan kesalahan pengelola bagasi atau kegagalan dalam sistem penyortiran. Kadang-kadang penumpang lain yang linglung, lelah setelah penerbangan panjang, akan mengambil Samsonite hitam yang sama atau tas olahraga mencolok seperti milik Anda dari sabuk bagasi. Oleh karena itu, tandai barang bawaan Anda: gantungkan seikat pita cerah atau mainan lunak kecil di pegangannya, tempelkan stiker besar di atasnya, atau cukup berikan preferensi pada warna yang tidak biasa saat memilih koper.

Apa yang tidak boleh didaftarkan di bagasi?
Ingat, semua maskapai penerbangan dan bandara kehilangan bagasi. Tentu saja, statistiknya berbeda untuk setiap orang, tetapi bahkan maskapai penerbangan paling andal pun bisa kehilangan atau menunda bagasi, dan bahkan di bandara terkecil, di mana seorang petugas bagasi akan mengangkut kereta berisi koper langsung dari konter check-in ke pesawat. Oleh karena itu, saya menyarankan Anda untuk selalu membawa tas tangan Anda:
- dokumen penting, termasuk yang tidak diperlukan selama penerbangan (misalnya, pada perjalanan terakhir saya ke St. Petersburg, saya perlu mengganti SIM, dan di tas tangan saya membawa surat nikah dan segala macam kartu dari sekolah mengemudi)
- kunci (dikombinasikan dengan tag dengan alamat Anda, ini bisa berbahaya)
- uang, perhiasan (tidak ada komentar)
- peralatan rapuh yang mahal
- obat-obatan yang rutin Anda minum, dalam jumlah yang diperlukan untuk penerbangan, dan dengan sedikit cadangan jika Anda harus mencari analog di negara atau kota asing. Obat resep yang tidak dapat dibeli jika bagasi Anda hilang, bawalah sebanyak yang diperlukan untuk seluruh perjalanan.
- sesuatu yang mungkin dibutuhkan segera pada saat kedatangan (misalnya, pengisi daya untuk telepon
- sesuatu yang memiliki nilai sentimental bagi Anda secara pribadi: terkadang bagasi hilang selamanya, dan jika kehilangan buku harian pribadi membuat Anda patah hati, lebih baik tinggalkan di rumah atau bawa bersama Anda di pesawat

Sebuah kisah instruktif: selama saya bekerja di Lufthansa di St. Petersburg, sepasang suami istri dari Amerika berlari ke kantor kami, meremas-remas tangan mereka - barang bawaan mereka, yang berisi dokumen-dokumen yang sangat penting untuk sidang adopsi, belum tiba, sidangnya keesokan harinya. Tentu saja maskapai penerbanganlah yang harus disalahkan atas hilangnya bagasi, tapi siapa yang diuntungkan? Untuk menghindari situasi seperti itu, cukup dengan menaruh surat-surat penting di tas tangan Anda.

Jadi, Anda sudah sampai dan tidak menemukan barang bawaan Anda di sabuk bagasi. Apa yang harus dilakukan?
1. Jika Anda mendaftarkan barang bawaan Anda selain koper biasa: ski, cello, panel plasma seukuran dinding, kereta dorong bayi, Great Dane marmer hidup, periksa apakah ada titik terpisah untuk mengeluarkan apa yang disebut. bagasi besar atau bagasi besar - bagasi yang serupa dengan yang saya jelaskan di atas sering kali dimasukkan ke dalam kompartemen terpisah dan diturunkan secara terpisah, secara manual. Jika barang bawaan Anda juga tidak ditemukan di sana
2. Pergi ke pelacakan bagasi atau loket Lost & Found. Di sana Anda perlu mengisi formulir khusus informasi rinci tentang barang bawaan Anda: rute, penampilan, daftar singkat isinya, kontak Anda di tempat tinggal permanen dan tempat tinggal sementara Anda. Selain itu, dalam layanan penelusuran bagasi, kemungkinan besar Anda akan melihat bagan bagasi seperti ini:

Berdasarkan klasifikasi inilah bagasi Anda yang hilang akan diberi kode dan, agar Anda paham, kedua koper ini akan diberi kode yang sama:

Jadi jangan ragu untuk menambahkan detail tambahan dalam deskripsi dan jangan melewatkan klausa konten. Biasanya, saat pertama kali mengisi laporan keterlambatan bagasi, Anda akan diminta untuk menunjukkan beberapa item isi yang dapat digunakan untuk mengidentifikasi tas Anda jika tidak ada tanda pengenal di bagian luar dan tas harus dibuka (jika tas dibuka, Anda akan menaruh pemberitahuan tentang ini). Contoh buruk: T-shirt / buku / tisu basah, contoh bagus: bikini merah cerah / katalog reproduksi Malevich / besi lipat. Setelah mengisi aplikasi, petugas bagasi tracing akan memberikan nomor dengan format XXXYY11111, dimana XXX adalah kode bandara kedatangan, YY adalah kode maskapai kedatangan + 5 digit nomor seri aplikasi: misalnya JFKLH12345, jika Anda terbang dengan Lufthansa ke Bandara Kennedy di New York. Ingat atau tulis nomor ini - ini akan menjadi cara termudah untuk menemukan lamaran Anda di lamaran mendatang.
Dengan menggunakan nomor yang sama Anda dapat memeriksa status pencarian DIRI (untuk beberapa alasan tautannya hilang: jika tidak berfungsi untuk Anda, google World Tracer Online dan secara harfiah tautan kedua - dengan judul Pelacakan Bagasi di situs web worldtracer.aero - adalah yang Anda butuhkan), karena melewati kehilangan & ditemukan seringkali sangat sulit
3. Coba hubungi kantor maskapai penerbangan Anda di bandara kedatangan: kadang-kadang (saya tekankan - KADANG!) jika Anda belum terbang pulang, tetapi ke tempat tinggal sementara (liburan, perjalanan bisnis), maskapai dapat menyediakan satu set perlengkapan mandi (Lufthansa memilikinya). termasuk T-shirt besar, sikat gigi dan pasta gigi, sisir, paket kecil sampo dan sabun mandi, sebungkus bubuk cuci, dll.) atau melakukan pembayaran tunai dalam jumlah kecil untuk pengeluaran kecil. tempat (spot pembayaran tunai).

Apa yang akan terjadi selanjutnya?
File Anda (yang disebut AHL) akan masuk ke sistem pencarian bagasi terpusat (World Tracer). Semua barang bawaan yang tidak diklaim masuk ke dalam sistem pencarian yang sama, tidak peduli apakah barang tersebut ditemukan tanpa label di sudut dan celah halaman bagasi atau tetap berada di sabuk bagasi; untuk setiap barang tersebut, ada file dengan format XXXYY11111 juga dibuat, hanya dari subtipe yang berbeda - yang disebut. laporan di tangan atau OHD. Jika data dari file AHL dan OHD cocok (nama belakang, deskripsi koper, rute, dll.), kedua stasiun (tempat dilaporkannya kehilangan bagasi dan tempat ditemukannya bagasi yang tidak diklaim) akan menerima pemberitahuan, dan kemudian ini masalah teknologi: pengecekan ulang dan jika berhasil meneruskan barang bawaan ke kota yang diinginkan. Tentu saja jumlahnya banyak buatan sendiri- perpesanan, menolak koper yang serupa tetapi tidak sama, ditambah balasan ke beberapa koper panggilan telepon- secara umum staf layanan pencarian bagasi tidak pernah bosan.
Perkiraan statistik: lebih dari 90% bagasi yang hilang ditemukan dalam 3 hari pertama pencarian, 3% hilang selamanya.
Apa yang bisa kamu lakukan?
1. Jika Anda harus membeli sesuatu yang sangat dibutuhkan pada saat kedatangan (mulai dari sikat gigi hingga setelan bisnis), pastikan untuk menyimpan kuitansi Anda untuk kompensasi nanti. Namun, Anda harus menghindari pembelian mahal yang tidak perlu; saya akan menjelaskan alasannya nanti.
2. Mengikuti langkah-langkah baru, buatlah daftar isi sedetail mungkin, sebaiknya dengan warna, merek dan perkiraan biaya setiap item, idealnya dalam bahasa Inggris (jika tidak, karyawan maskapai penerbangan harus menerjemahkan daftar ini untuk masuk ke sistem), hubungi maskapai penerbangan dan kirimkan daftar ini kepada mereka, itu akan ditambahkan ke aplikasi pencarian bagasi. Selama 5 hari pertama, pencarian bagasi dilakukan di bandara kedatangan, kemudian pencarian menjadi tanggung jawab maskapai pengangkut (maskapai penerbangan yang tertera di nomor aplikasi - ingat JFKLH12345?), dan setelah 21 hari Anda dapat mengajukan permohonan kompensasi akhir.
3. Apabila setelah 21 hari sejak tanggal pengajuan surat keterangan kehilangan bagasi belum ditemukan, hubungi maskapai penerbangan untuk meminta ganti rugi. Kalau tidak salah, jangka waktu pembatasannya adalah 2 tahun, yaitu. Anda dapat mengajukan ganti rugi dalam waktu dua tahun sejak tanggal pengajuan klaim kerugian.

Pembayaran kompensasi.
Untuk membayar kompensasi, Anda perlu menghubungi kantor perwakilan maskapai Anda dengan permohonan pembayaran, dokumen yang mengonfirmasi penerbangan dan fakta kehilangan bagasi (boarding pass, label bagasi, nomor klaim kehilangan bagasi, rincian pembayaran). Jika saya tidak salah, di Federasi Rusia keputusan mengenai kompensasi harus dipertimbangkan secara hukum dalam waktu 30 hari. Anda mungkin juga diminta untuk memperkirakan biaya isinya dan, jika mungkin, memberikan tanda terima pembelian koper dan barang-barang di dalamnya (Saya memahami bahwa hal ini tidak realistis dalam banyak kasus, tetapi ini adalah bagian dari prosedur).
Sebelumnya, pembayaran dilakukan berdasarkan berat bagasi terdaftar - sekitar $20 per kilogram. Kemudian, sistem pembayaran diubah dan tanggung jawab maskapai penerbangan dibatasi hingga 1.000 unit konvensional (biaya unit konvensional dihitung di dalam maskapai), yang pada saat saya bekerja setara dengan sekitar 1.300 euro. Itu. bahkan jika Anda membawa kwitansi pembelian koper Louis Vuitton yang terbuat dari seribu kulit tokek Bolivia dan diisi berlian, Anda tidak akan mendapatkan lebih dari 1.300 euro.