Karena ada begitu banyak upvotes untuk pertanyaan tersebut, meskipun masalah multithreading terlalu luas untuk format jawaban, saya akan mencoba menjelaskan mengapa Anda tidak boleh menggunakan wordpress API dengan cara multithreaded ....
TL; DR - PHP tidak diasumsikan multithreading siap, masalahnya bukan PHP itu sendiri tetapi terutama perpustakaan yang digunakannya. Inilah sebabnya mengapa disarankan untuk tidak menggunakan mode eksekusi multithreaded di apache walaupun secara teori seharusnya lebih cepat. Untuk menambah masalah lapisan yang mendasarinya tidak siap multithread, inti wordpress melanggar persyaratan paling mendasar multithread- tidak ada akses gratis ke global.
Apa masalah dengan global dalam lingkungan multithreaded? mari kita asumsikan kita memiliki kode yang terlihat naif
function inc() {
global $g;
$g++;
}
Meskipun hanya satu liner, itu bukan operasi atom untuk CPU, dan dibutuhkan beberapa instruksi tingkat mesin untuk menjalankannya secara aktual. Sesuatu seperti
move $g to register D
increment register D
move register D to $g
Sekarang mari kita asumsikan kita memiliki dua utas AB yang memanggil inc()
pada "waktu yang sama" (jelas dengan hanya satu CPU tidak ada yang namanya waktu yang sama), dan bahwa nilai awal $ g adalah 0, berapakah nilai $ g setelah kedua utas selesai? Ini akan tergantung pada bagaimana OS menangani multithreading, kapan ia beralih di antara utas. Dalam OS gaya "lama" itu adalah tugas utas untuk mendeklarasikan dengan memanggil API bahwa kontrol dapat diambil darinya, tetapi itu menyebabkan banyak masalah dengan proses perilaku buruk mengunci sistem karenanya dalam "modern" OS yang diambil OS kontrol kapan pun rasanya seperti itu. Dalam kehidupan nyata hasil kode adalah $ g akan memiliki nilai 2, tetapi ada juga kemungkinan berikut
Dalam konteks A
move $g to register D
// value of D is 0
// OS stores the content of registers and switches to thread B
// B increments $g to 1 and finishes working
// OS restores content of registers to the context of thread A
// Value of register D is now 0
increment register D
move register D to $g
Hasil akhirnya adalah $ g memiliki nilai 1.
Jelas global bukan satu-satunya masalah dan penanganan input dan output juga merupakan inti untuk masalah mutithreading.
Dalam kode multithreading yang tepat Anda menggunakan kunci / mutex / semaphore / pipa / socket .... untuk membuat serial akses ke sumber daya global tersebut untuk memastikan akan ada hasil yang dapat diprediksi untuk operasi. Wordpress tidak melakukan itu.
Sial, wordpress bahkan bukan multi-proses yang aman. Sebagian besar waktu berlalu begitu saja karena skema DB dibangun dengan cara yang dalam penggunaan kehidupan nyata mencegah kebutuhan untuk memodifikasi data yang sama dari proses yang berbeda (posting yang berbeda memiliki baris yang berbeda dan tidak berbagi data), tetapi lihatlah kode sidebar / widget dan coba bayangkan apa yang akan terjadi jika dua admin akan mencoba menambahkan widget yang berbeda pada waktu yang bersamaan. Karena ini akan memerlukan manipulasi dari satu opsi tertentu, hasil akhirnya dapat berupa widget yang ditambahkan atau hanya salah satunya.
Kembali ke multithrading. Dalam unix, tidak seperti windows, biaya tambahan untuk menghasilkan suatu proses alih-alih thread dapat diabaikan, karenanya menggunakan wp_remote_get
dengan beberapa url khusus untuk memanggil "thread" tambahan adalah hal yang sangat sah untuk dilakukan dan menghindari hampir semua jebakan yang terkait dengan multithreading.