Hướng dẫn dùng parralle trong PHP
Các PHP Developers hiếm khi sử dụng đa luồng. Sự đơn giản của chương trình đồng bộ, đơn luồng chắc chắn rất hấp dẫn, nhưng đôi khi việc sử dụng đa luồng có thể mang lại một số cải tiến hiệu suất đáng kể. Show Nội dung chính
Nội dung chính
Trong bài viết này, tôi sẽ giới thiệu cho các bạn cách tạo luồng trong PHP với pthreads extension. Để làm được điều này cần cài đặt PHP 7x ZTS (Zend Thread Safety), cùng với pthreads v3. (Tại thời điểm viết, người sử dụng PHP 7.1 sẽ cần phải cài đặt từ nhánh master của repo pthreads - xem phần này của bài viết để biết chi tiết về việc build các third-party extensions từ source). PS: pthreads v2 nhắm vào PHP 5.x và không còn được hỗ trợ; pthreads v3 nhắm vào PHP 7.x và đang được phát triển tích cực. Khi nào không sử dụng pthreadsTrước khi chúng ta tiếp tục, trước tiên tôi muốn làm rõ khi bạn không nên (cũng như không thể) sử dụng pthreads extension. Trong pthreads v2, khuyến nghị là không nên sử dụng pthreads trong web server environment (tức là trong FCGI process). Theo pthreads v3, đề xuất này đã được thi hành, vì vậy bây giờ bạn chỉ đơn giản là không thể sử dụng nó trong web server environment. Hai lý do nổi bật cho điều này là:
Đó là lý do tại sao threads không phải là một giải pháp tốt trong environment như vậy. Nếu bạn đang tìm kiếm threads như là một giải pháp cho các tác vụ chặn IO (chẳng hạn như thực hiện các yêu cầu HTTP), hãy để tôi chỉ cho bạn theo hướng lập trình không đồng bộ (asynchronous programming), có thể đạt được qua các framework như Amp. SitePoint đã phát hành một số bài báo xuất sắc về chủ đề này (như Writing Async Libraries và Modding Minecraft in PHP), trong trường hợp bạn quan tâm. Xử lý các tasks một lầnĐôi khi, bạn muốn xử lý các tasks một lần theo cách đa luồng (như thực hiện một số IO-bound
task). Trong trường hợp như vậy, Ví dụ:
Ở trên, Chúng ta có thể tách các class bằng cách extend Threaded class, chúng có thể chạy được bên trong các threads khác:
Bất kỳ class nào cần chạy được bên trong của một thread riêng biệt Chúng ta hãy nhìn vào kiến trúc các classes của pthreads:
Chúng ta đã nhìn thấy và tìm hiểu những điều căn bản về các class Thread và Threaded, vậy bây giờ hãy xem ba phần còn lại (Worker, Volatile và Pool). Recycling threadsTách một thread mới cho mỗi tác vụ chạy song song là khó khăn. Điều này là do một shared-nothing architecture phải được sử dụng bởi pthreads để tạo được
threading bên trong PHP. Điều này có nghĩa là toàn bộ execution context của PHP interpreter (bao gồm mọi class, interface, trait và function) phải được sao chép cho mỗi thread được tạo. Vì điều này làm giảm performance đáng kể, vì vậy nên luôn luôn sử dụng lại một thread khi có thể. Các thread có thể được sử dụng lại theo hai cách: với
Nhìn nhanh vào ví dụ sau:
Output: Đoạn code trên stack 15 works vào đối tượng Worker class cung cấp một số methods khác liên quan đến stack task của nó, bao gồm Một cách khác để sử dụng lại một thread khi thực hiện nhiều nhiệm vụ là sử dụng một thread pool (thông Chúng ta hãy xem ví dụ trên được thay thế bằng cách sử dụng pool của workers:
Output: Có một vài khác biệt đáng chú ý giữa việc sử dụng một pool như trái ngược với một worker. Thứ nhất, pool không cần phải manually started, chúng bắt đầu thực hiện task ngay khi có thể. Thứ hai, chúng ta submit các tasks cho các pool, chứ không phải stack chúng. Ngoài ra, Theo thực tế, workers và pools nên luôn luôn collect tasks sau khi hoàn thành, và manually shut down. Các thread tạo ra qua pthreads và tính bất biếnClass cuối cùng chúng ta tìm hiểu là Chúng ta hãy xem xét một ví dụ để chứng minh các ràng buộc bất biến mới:
Các Threaded properties của các
Chúng ta có thể thấy rằng Chỉ có một chủ đề cơ bản cuối cùng để đề cập đến sự thay đổi và các Hãy xem lại một ví dụ để hiểu rõ hơn về mọi thứ:
Chúng ta có thể thấy rằng các Demo:
Ngoài ra còn có các method khác như Đồng bộ hoá (Synchronization)Chủ đề cuối cùng chúng tôi sẽ giới thiệu trong bài viết này là đồng bộ hóa trong pthreads. Đồng bộ hóa là một kỹ thuật cho phép kiểm soát truy cập vào các tài nguyên chia sẻ. Ví dụ, chúng ta hãy thực hiện counter đơn giản:
Không sử dụng đồng bộ, đầu ra sẽ không được xác định. Multiple threads ghi vào một biến duy nhất mà không kiểm soát quyền truy cập sẽ khiến các bản cập nhật bị mất. Hãy khắc phục điều này bằng cách thêm đồng bộ hóa để chúng ta nhận được đầu ra chính xác là 20:
Đồng bộ các khối mã cũng có thể hợp tác với nhau bằng cách sử dụng Dưới đây là một gia tăng đáng kinh ngạc từ 2 sựđồng bộ hóa trong vòng lặp:
Bạn có thể đã nhận thấy các điều kiện bổ sung đã được đặt xung quanh Kết luậnChúng ta đã thấy 5 class của pthreads ( Tham khảo
|