Saat Anda perlu mempercepat aplikasi, tetapi menurut Anda semuanya telah dioptimalkan, Anda dapat meningkatkan kinerja dengan membagi pemrosesan data. Misalnya, jika Anda memiliki file dengan 1000 baris dan Anda ingin membacanya lebih cepat Show
Jadi, Anda dapat membuat, misalnya, 10 node yang akan mengambil potongannya sendiri, membaca datanya, dan mengerjakan sisanya. Dalam hal ini, Anda akan memproses file 10 kali lebih cepat Perbedaan antara Multiprocessing dan MultithreadingPerbedaannya adalah utas berjalan di ruang memori yang sama, sedangkan proses memiliki memori terpisah. Ini membuatnya sedikit lebih sulit untuk berbagi objek antar proses dengan multiprosesing Proses pemijahan sedikit lebih lambat daripada pemijahan utas. Begitu mereka berjalan, tidak ada banyak perbedaan Aplikasi PHP multithreading (PThreads)PThreads (v3) hanya dapat digunakan dengan PHP 7. 2+. Ini karena mode ZTS tidak aman di 7. 0 dan 7. 1 Untuk menggunakan PThreads, Anda memerlukan build PHP dengan ZTS (Zend Thread Safety) diaktifkan ( --enable-maintainer-zts atau --enable-zts di Windows ). Itu artinya Anda harus membangun (atau membangun kembali) PHP Anda. Proses ini dapat memakan waktu sekitar 30 menit (tergantung perangkat keras tempat Anda membuatnya). Selain itu, jika Anda memiliki ekstensi tambahan (terutama ekstensi PECL), ekstensi tersebut mungkin tidak berfungsi (atau bahkan dikompilasi) dengan benar Mempertimbangkan kelemahan ini, sebagian besar proyek memutuskan untuk menghindari PThread sama sekali Aplikasi multiproses PHP (PCNTL)Ini adalah metode paling dasar dalam banyak proyek sederhana. Kami akan memotong proses PHP kami menggunakan Saat Terkadang kami memiliki proses anak yang membutuhkan waktu eksekusi lebih lama daripada proses orang tua. Kemudian kita dapat menggunakan fungsi khusus Pertukaran data lintas prosesProses forking sederhana. Tapi menyusun mereka bersama tidak mungkin. Dan bagaimana jika kita perlu menerima data dari anak (atau bahkan beberapa anak proses)? Nah, implementasinya bisa didasarkan pada beberapa pendekatan. memori bersama, file sementara, pemipaan proses, dll. Namun jika kami membutuhkan perpesanan instan, kami akan menggunakan Kami punya pertanyaan lain. bagaimana cara memanggil prosedur membaca untuk menghentikan proses utama dan mendapatkan data dari seorang anak? Untuk tujuan ini, kita dapat menggunakan pcntl_signal dan posix_kill
Artikel ini ditinjau oleh rekan sejawat oleh Christopher Pitt. Terima kasih kepada semua peninjau sejawat SitePoint karena membuat konten SitePoint sebaik mungkin Pengembang PHP tampaknya jarang memanfaatkan paralelisme. Daya tarik kesederhanaan pemrograman sinkron, single-threaded tentu saja tinggi, tetapi terkadang penggunaan sedikit konkurensi dapat membawa beberapa peningkatan kinerja yang bermanfaat. Pada artikel ini, kita akan melihat bagaimana threading dapat dilakukan di PHP dengan ekstensi pthreads. Ini akan membutuhkan versi ZTS (Zend Thread Safety) dari PHP 7. x diinstal, bersama dengan pthreads v3 diinstal. (Pada saat penulisan, PHP 7. 1 pengguna perlu menginstal dari cabang master repo pthreads – lihat detail tentang membangun ekstensi pihak ketiga dari sumber. ) Hanya sebagai klarifikasi cepat. pthreads v2 menargetkan PHP 5. x dan tidak lagi didukung; . x dan sedang dikembangkan secara aktif Terima kasih banyak kepada Joe Watkins (pencipta ekstensi pthreads) untuk mengoreksi dan membantu meningkatkan artikel saya Kapan tidak menggunakan pthreadsSebelum kita melanjutkan, pertama-tama saya ingin mengklarifikasi kapan Anda tidak boleh (dan juga tidak bisa) menggunakan ekstensi pthreads Di pthreads v2, rekomendasinya adalah bahwa pthreads tidak boleh digunakan di lingkungan server web (mis. e. dalam proses FCGI). Pada pthreads v3, rekomendasi ini telah diterapkan, jadi sekarang Anda tidak dapat menggunakannya di lingkungan server web. Dua alasan utama untuk ini adalah
Itu sebabnya threading bukanlah solusi yang baik di lingkungan seperti itu. Jika Anda mencari threading sebagai solusi untuk tugas pemblokiran IO (seperti melakukan permintaan HTTP), izinkan saya mengarahkan Anda ke arah pemrograman asinkron, yang dapat dicapai melalui kerangka kerja seperti Amp. SitePoint telah merilis beberapa artikel bagus yang mencakup topik ini (seperti menulis perpustakaan asinkron dan Modding Minecraft di PHP), jika Anda tertarik Dengan itu, mari kita langsung ke hal-hal Menangani tugas satu kaliTerkadang, Anda ingin menangani tugas satu kali dengan cara multi-utas (seperti melakukan beberapa tugas yang terikat IO). Dalam kasus seperti itu, kelas 2 dapat digunakan untuk membuat utas baru dan menjalankan beberapa unit kerja di utas terpisah ituSebagai contoh _Di atas, metode _3 adalah unit kerja kami yang akan dieksekusi di dalam utas baru. Saat memanggil 4, utas baru muncul dan metode 3 dipanggil. Kami kemudian menggabungkan utas yang dihasilkan kembali ke utas utama (melalui 6), yang akan memblokir hingga utas terpisah selesai dieksekusi. Ini memastikan bahwa tugas telah selesai dieksekusi sebelum kami mencoba menampilkan hasilnya (disimpan di 7)Mungkin tidak diinginkan untuk mencemari tanggung jawab kelas dengan logika terkait utas (termasuk harus mendefinisikan metode 3). Kami dapat memisahkan kelas-kelas tersebut dengan meminta mereka memperluas kelas 9 sebagai gantinya, di mana mereka kemudian dapat dijalankan di dalam utas lainnya
Kelas apa pun yang perlu dijalankan di dalam utas terpisah harus memperluas kelas 9 dengan cara tertentu. Ini karena memberikan kemampuan yang diperlukan untuk berjalan di dalam utas yang berbeda, serta memberikan keamanan implisit dan antarmuka yang berguna (untuk hal-hal seperti sinkronisasi sumber daya)Mari kita lihat sekilas hierarki kelas yang diekspos oleh pthreads
Kita telah melihat dan mempelajari dasar-dasar tentang kelas 2 dan 9, jadi sekarang mari kita lihat tiga sisanya ( 3, 4, dan 5)Benang daur ulangMemutar utas baru untuk setiap tugas yang akan diparalelkan itu mahal. Ini karena arsitektur shared-nothing harus digunakan oleh pthreads untuk mencapai threading di dalam PHP. Artinya, seluruh konteks eksekusi dari instance interpreter PHP saat ini (termasuk setiap kelas, antarmuka, sifat, dan fungsi) harus disalin untuk setiap utas yang dibuat. Karena ini menimbulkan dampak kinerja yang nyata, utas harus selalu digunakan kembali jika memungkinkan. Utas dapat digunakan kembali dengan dua cara. dengan _3s atau dengan 5sKelas _3 digunakan untuk menjalankan serangkaian tugas secara sinkron di dalam utas lain. Ini dilakukan dengan membuat instance _3 baru (yang membuat utas baru), lalu menumpuk tugas ke utas terpisah tersebut (melalui 0)Ini contoh singkatnya
Keluaran Di atas menumpuk 15 tugas ke objek 1 baru melalui 0, dan kemudian memprosesnya dalam urutan bertumpuk. Metode _3, seperti yang terlihat di atas, digunakan untuk membersihkan tugas setelah selesai dijalankan. Dengan menggunakannya di dalam while loop, kami memblokir utas utama sampai semua tugas yang ditumpuk selesai dieksekusi dan telah dibersihkan sebelum kami memicu 4. Mematikan pekerja sebelum waktunya (mis. e. sementara masih ada tugas yang harus dijalankan) masih akan memblokir utas utama sampai semua tugas selesai dijalankan - tugas tidak akan dikumpulkan dari sampah (menyebabkan kebocoran memori)Kelas _3 menyediakan beberapa metode lain yang berkaitan dengan tumpukan tugasnya, termasuk 6 untuk menghapus tumpukan item terlama, dan 7 untuk jumlah item pada tumpukan eksekusi. Tumpukan pekerja hanya menampung tugas yang akan dieksekusi. Setelah tugas di tumpukan dieksekusi, tugas itu dihapus dan kemudian ditempatkan di tumpukan (internal) terpisah untuk dikumpulkan sampah (menggunakan 3)Cara lain untuk menggunakan kembali utas saat menjalankan banyak tugas adalah dengan menggunakan kumpulan utas (melalui kelas 5). Kumpulan utas diberdayakan oleh sekelompok 3 untuk memungkinkan tugas dieksekusi secara bersamaan, di mana faktor konkurensi (jumlah utas tempat kumpulan berjalan) ditentukan saat pembuatan kumpulanMari sesuaikan contoh di atas untuk menggunakan kumpulan pekerja sebagai gantinya
Keluaran Ada beberapa perbedaan penting antara menggunakan kumpulan dibandingkan dengan pekerja. Pertama, kumpulan tidak perlu dimulai secara manual, mereka mulai menjalankan tugas segera setelah tersedia. Kedua, kami mengirimkan tugas ke kumpulan, daripada menumpuknya. Juga, kelas 5 tidak memperpanjang 9, sehingga tidak dapat diteruskan ke utas lainnya (tidak seperti 3)Sebagai praktik yang baik, pekerja dan kumpulan harus selalu mengumpulkan tugas mereka setelah selesai, dan ditutup secara manual. Utas yang dibuat melalui kelas _2 juga harus digabungkan kembali ke utas pembuatpthreads dan (im) mutabilitasKelas terakhir yang akan dibahas adalah 4 – tambahan baru untuk pthreads v3. Kekekalan telah menjadi konsep penting dalam pthreads, karena tanpanya, kinerja akan sangat menurun. Oleh karena itu, secara default, properti kelas 9 yang merupakan objek 9 itu sendiri sekarang tidak dapat diubah, sehingga tidak dapat dipindahkan setelah penugasan awal. Mutabilitas eksplisit untuk properti seperti itu sekarang disukai, dan masih bisa dilakukan dengan menggunakan kelas 4 yang baruMari kita lihat sekilas contoh untuk mendemonstrasikan batasan kekekalan yang baru
_9 properti dari 4 kelas, di sisi lain, dapat berubah
Kita dapat melihat bahwa kelas _4 mengesampingkan kekekalan yang diberlakukan oleh kelas induknya 9 untuk memungkinkan 9 properti dapat ditetapkan kembali (serta 4)Hanya ada satu topik mendasar terakhir yang harus dibahas sehubungan dengan mutabilitas dan kelas 4 - array. Array di pthreads secara otomatis dipaksa ke 4 objek saat ditugaskan ke properti kelas 9. Ini karena tidak aman untuk memanipulasi array dari berbagai konteks di PHPMari kita sekali lagi melihat contoh untuk lebih memahami berbagai hal
Kita dapat melihat bahwa 4 objek dapat diperlakukan seolah-olah mereka adalah array, karena mereka memberikan dukungan untuk operasi berbasis array (seperti yang ditunjukkan di atas) dengan operator subset ( 9). 4 kelas tidak, bagaimanapun, didukung oleh fungsi berbasis array umum, seperti 1 dan 2. Sebagai gantinya, kelas _9 memberi kita operasi seperti metode bawaanSebagai demonstrasi
Operasi lain yang didukung meliputi _4 dan 5SinkronisasiTopik terakhir yang akan kita bahas dalam artikel ini adalah sinkronisasi dalam pthreads. Sinkronisasi adalah teknik untuk memungkinkan akses terkontrol ke sumber daya bersama Sebagai contoh, mari terapkan penghitung naif
Tanpa menggunakan sinkronisasi, hasilnya tidak deterministik. Beberapa utas menulis ke satu variabel tanpa akses terkontrol telah menyebabkan pembaruan hilang Mari perbaiki ini dengan menambahkan sinkronisasi sehingga kami menerima hasil yang benar dari 6 0Blok kode yang disinkronkan juga dapat bekerja sama satu sama lain menggunakan 7 dan 8 (bersama dengan 9)Inilah peningkatan yang mengejutkan dari dua while loop yang disinkronkan _1Anda mungkin telah memperhatikan kondisi tambahan yang ditempatkan di sekitar pemanggilan ke 7. Ketentuan ini sangat penting karena hanya mengizinkan panggilan balik yang disinkronkan untuk dilanjutkan setelah menerima pemberitahuan dan ketentuan yang ditentukan adalah 1. Ini penting karena pemberitahuan mungkin berasal dari tempat selain panggilan ke 8. Jadi, jika panggilan ke _7 tidak disertakan dalam kondisi, kami akan terbuka untuk panggilan bangun palsu, yang akan menyebabkan kode yang tidak dapat diprediksiKesimpulanKita telah melihat lima paket pthreads kelas dengan itu ( 9, 2, 3, 4, dan 5), termasuk penutup ketika masing-masing kelas digunakan. Kami juga telah melihat konsep kekekalan baru di pthreads, serta melakukan tur singkat tentang fitur sinkronisasi yang didukungnya. Dengan dasar-dasar ini tercakup, kita sekarang dapat mulai melihat penerapan pthreads ke beberapa kasus penggunaan dunia nyata. Itu akan menjadi topik posting kami selanjutnyaSementara itu, jika Anda memiliki beberapa ide aplikasi tentang pthreads, jangan ragu untuk menuliskannya di bawah ini ke area komentar Bagikan Artikel IniThomas Punt Thomas adalah mahasiswa Teknologi Web yang baru saja lulus dari Inggris. Dia memiliki minat yang kuat dalam pemrograman, dengan fokus khusus pada teknologi pengembangan web sisi server (khususnya PHP dan Elixir). Dia berkontribusi pada PHP dan proyek sumber terbuka lainnya di waktu luangnya, serta menulis tentang topik yang menurutnya menarik Apakah multithreading dimungkinkan dalam PHP?Aplikasi PHP, tidak diragukan lagi bekerja secara efektif dengan kemampuan multithreading . Multithreading adalah sesuatu yang mirip dengan multitasking, tetapi memungkinkan untuk memproses banyak pekerjaan sekaligus, bukan pada banyak proses.
Bagaimana cara membuat multi utas PHP?PHP tidak memberikan fungsionalitas multi-threading bawaan, kita perlu menambahkan "utas" paket/ekstensi ke PHP kita . Objek Berulir. Kelas yang merupakan unit instruksi yang dapat dieksekusi (utas), Ini adalah apa yang ingin Anda jalankan secara tidak sinkron. metode run di kelas ini memiliki kemampuan untuk mengeksekusinya sebagai utas.
Apakah PHP mendukung threading?Aplikasi PHP dapat membuat, membaca, menulis, mengeksekusi, dan menyinkronkan dengan objek Threads, Worker, dan Threaded . Ekstensi ini dianggap tidak terawat dan mati. Pertimbangkan untuk menggunakan paralel sebagai gantinya. Ekstensi pthreads tidak dapat digunakan di lingkungan server web.
Bagaimana cara membuat utas di PHP?Utasan PHP . Objek Berulir. Kelas yang merupakan unit instruksi yang dapat dieksekusi (utas), Ini adalah apa yang ingin Anda jalankan secara tidak sinkron. . Pekerja. Ini adalah kelas yang digunakan untuk menangani utas, membuat hasil disinkronkan Kolam. Kelas ini digunakan untuk menangani beberapa instance kelas pekerja dan mengelolanya |