2013-06-04 31 views
5

Sau một vài nỗ lực, tôi đã quản lý để thiết lập một máy chủ đa luồng PHP nhận đầu vào từ nhiều WebSockets và chuyển nó vào một socket TCP duy nhất. Tôi đã thực hiện điều này với pthreads và được quản lý để sử dụng đối tượng Stackable làm một mảng.sự khác biệt giữa Chủ đề, Công nhân, Mutex, Stackable?

Bước tiếp theo bây giờ là thực sự hiểu những gì tôi đang làm và chắc chắn nhất những gì tôi có thể làm tốt hơn. Tôi đọc một nơi nào đó ở đây trên SO mà đa luồng không phải là một cái gì đó bạn chỉ cần 'làm'. Vì lý do đó tôi muốn đào sâu hơn trước khi tôi tiếp tục viết mã. Mang đến cho tôi những câu hỏi sau:

Có nghĩa là gì bởi A Worker Thread has a persistent state (pthreads.org). Công nhân sẽ tiếp tục chạy khi ra khỏi phạm vi? Mối quan hệ của họ với Stackables là gì?

Hướng dẫn sử dụng PHP cho biết chuỗi công việc nên được sử dụng trên Chủ đề, tại sao?

Tôi hy vọng câu hỏi của tôi không rộng.

Trả lời

13

Chủ đề công việc có trạng thái liên tục: khi bạn bắt đầu một chuỗi công nhân, nhân viên có sẵn để thực hiện cho đến khi biến nằm ngoài phạm vi hoặc nhân viên tắt máy.

Lấy ví dụ về tập lệnh tải xuống nhiều trang từ nhiều nguồn trực tuyến: trên quy mô nhỏ, bạn có thể thoát ra và có thể là thiết kế tốt nhất để có nhiều luồng, mỗi chuỗi xử lý một yêu cầu xử lý nội dung. Tuy nhiên, thông thường, bạn nên coi nó là một sự lãng phí lớn để bắt đầu một luồng để thực hiện một yêu cầu đơn lẻ, hoặc thực thi mọi thứ rất đơn giản, thay vào đó bạn sẽ bắt đầu nhiều công nhân như phần cứng và môi trường của bạn có thể quản lý và thực hiện yêu cầu và xử lý nội dung như một Stackable. Khi sử dụng Công nhân, mỗi yêu cầu không làm bạn mất phí khi khởi tạo ngữ cảnh luồng. Sự kiên trì trong bối cảnh này đề cập đến thực tế là mỗi Stackables có thể đọc $ this-> worker, và truy cập tất cả/bất kỳ phạm vi toàn cục (bao gồm biến tĩnh lớp), vì vậy từ phối cảnh Stackable trong khi thực hiện ngữ cảnh Công nhân vẫn tồn tại, trên thực tế, Stackables đơn giản là chia sẻ một bối cảnh.

Mutex và Cond có ở đó cho người nghiện luồng vi-rút posix, và cho mục đích của tôi trong quá trình phát triển chính pthreads. Người dùng bình thường không thực sự phải sử dụng chức năng này, mặc dù nó cũng được ghi nhận là các hàm posix của đối tác và phần lớn tài liệu gốc vẫn được áp dụng (với một lớp hợp lý trên đầu). Mutex và Cond là cả hai trình bao bọc mỏng xung quanh chức năng quen thuộc, và không thực sự nhắm vào Joe Bloggs.

Tôi đoán bạn đang tự hỏi nếu mutex là cần thiết để có đọc và viết an toàn của các đối tượng, điều này không phải là trường hợp, an toàn được xây dựng thành pthreads.

Lần bạn nên sử dụng Chuỗi trên một công nhân sẽ là; từ ví dụ, trên quy mô nhỏ. Ngoài ra, nếu bạn có phần cứng để hỗ trợ nó, Chủ đề có thể tạo Công nhân (và Chủ đề), cho chính nó vào các khả năng thiết kế hệ thống phức tạp hơn. Bạn cũng có thể trở nên tuyệt vời ở đây, trong trường hợp này bạn có thể lập trình các luồng của bạn để hoạt động như công nhân mà không cần phải khởi tạo đối tượng (stackables) cho mọi công việc. Một Worker là một Thread, chỉ một số chức năng của Thread đã được hi-jacked để thực hiện một danh sách Stackables, bạn sẽ thấy sự khác biệt tinh tế trong các phương thức đồng bộ của Thread và Worker, không quan trọng nếu bạn đang sử dụng công nhân như dự định . Tuy nhiên, nếu sự tuyệt vời của bạn khiến bạn nghĩ rằng tốt hơn là nên tránh mô hình chuẩn, thì bạn sẽ yêu cầu sự đồng bộ từ một đối tượng Thread để thực hiện một mẫu Worker trong PHP.

Thực tế là, nếu bạn đang tìm kiếm luồng, bạn muốn làm nhiều hơn 2 hoặc 3 thứ cùng một lúc, rất có thể là bạn có thể tìm ra cách để thực hiện một số việc. Vì vậy, việc cung cấp chức năng Worker/Stackable như là một phần của gói pthreads có ý nghĩa, vì nó phù hợp hơn để thực thi một loạt các thứ trong các ngữ cảnh riêng biệt, viết công cụ này trong PHP (ngay cả với sự trợ giúp của pthread) sẽ phức tạp.

+0

Cảm ơn bạn! đây là một trợ giúp rất lớn. Trong khi mã của tôi đang hoạt động, tôi đã đi đúng hướng. Tôi vẫn tự hỏi khi nào bạn sẽ sử dụng đối tượng Thread đơn giản. – marlonp33

+1

Được rồi, tôi đã cập nhật câu trả lời với một số thông tin mo về Chủ đề ... hy vọng sẽ trả lời câu hỏi của bạn một cách đầy đủ. –

+0

tôi đã phải đọc nhiều lần này để hiểu những gì bạn đang nói. nhưng cảm ơn! – Nerrve

Các vấn đề liên quan