Vì có quá nhiều câu hỏi đối với câu hỏi, mặc dù các vấn đề về đa luồng quá rộng đối với định dạng của câu trả lời, tôi sẽ cố gắng giải thích lý do tại sao bạn không nên sử dụng API wordpress theo cách đa luồng ....
TL; DR - PHP không được coi là đa luồng đã sẵn sàng, vấn đề không phải là bản thân PHP mà chủ yếu là các thư viện mà nó sử dụng. Đây là lý do tại sao không nên sử dụng chế độ thực thi đa luồng trong apache mặc dù về lý thuyết, nó sẽ nhanh hơn một chút. Để thêm vào vấn đề lớp cơ bản không sẵn sàng đa luồng, lõi wordpress vi phạm yêu cầu cơ bản nhất của đa luồng - không có quyền truy cập miễn phí vào toàn cầu.
Vấn đề với toàn cầu trong môi trường đa luồng là gì? giả sử chúng ta có mã tìm kiếm ngây thơ
function inc() {
global $g;
$g++;
}
Mặc dù nó chỉ là một lớp lót, nhưng nó không phải là một hoạt động nguyên tử cho CPU và phải mất một số hướng dẫn cấp độ máy để thực hiện nó một cách chủ động. Cái gì đó như
move $g to register D
increment register D
move register D to $g
Bây giờ hãy giả sử rằng chúng ta có hai luồng AB gọi inc()
"cùng một lúc" (rõ ràng chỉ có một CPU không có thứ gì giống nhau) và giá trị ban đầu của $ g là 0, giá trị của $ sẽ là bao nhiêu g sau khi cả hai chủ đề kết thúc? Nó sẽ phụ thuộc vào cách HĐH xử lý đa luồng, khi nào nó chuyển đổi giữa các luồng. Trong các HĐH kiểu "cũ", công việc của luồng phải khai báo bằng cách gọi API có thể lấy từ đó, nhưng điều đó dẫn đến nhiều vấn đề với các quy trình xử lý xấu khóa hệ thống trong HĐH "hiện đại" mà HĐH mất kiểm soát khi nào nó cảm thấy thích nó Trong cuộc sống thực, kết quả của mã sẽ là $ g sẽ có giá trị là 2, nhưng cũng có khả năng sau đây
Trong bối cảnh của 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
Kết quả cuối cùng là $ g có giá trị là 1.
Rõ ràng toàn cầu không phải là vấn đề duy nhất và xử lý đầu vào và đầu ra cũng là cốt lõi cho các vấn đề liên quan đến đọc sai.
Trong mã đa luồng thích hợp, bạn sử dụng khóa / mutex / semaphore / pipe / socket .... để tuần tự hóa quyền truy cập vào các tài nguyên toàn cầu đó để đảm bảo sẽ có kết quả dự đoán cho hoạt động. Wordpress không làm điều đó.
Địa ngục, wordpress thậm chí không phải là nhiều quá trình an toàn. Hầu hết thời gian nó bị loại bỏ vì lược đồ DB được xây dựng theo cách mà trong sử dụng thực tế ngăn không cần phải sửa đổi cùng một dữ liệu từ các quy trình khác nhau (các bài đăng khác nhau có các hàng khác nhau và không chia sẻ dữ liệu), nhưng hãy nhìn vào mã sidebar / widget và cố gắng tưởng tượng điều gì sẽ xảy ra nếu hai quản trị viên cố gắng thêm một widget khác cùng một lúc. Vì điều này sẽ yêu cầu thao tác của một tùy chọn cụ thể, kết quả cuối cùng có thể là cả hai vật dụng được thêm vào hoặc chỉ một trong số chúng.
Quay lại đa nhiệm. Trong unix, không giống như các cửa sổ, chi phí bổ sung để sinh ra một quy trình thay vì luồng là không đáng kể, do đó, việc sử dụng wp_remote_get
một số url đặc biệt để gọi thêm "luồng" là một điều rất hợp pháp để làm và tránh gần như tất cả các cạm bẫy liên quan đến đa luồng.