Tôi có một vài chức năng gọi lại và tôi muốn khởi chạy như nhiều tiến trình và có tất cả các chấm dứt thông qua tín hiệu từ quá trình cha mẹ.Làm thế nào để chấm dứt đúng quy trình con với đa xử lý trong python
Cách làm hiện tại của tôi là tạo một c_bool dùng chung với multiprocessing.Value
và đặt nó thành True
, sau đó phân phối nó cho tất cả các quy trình của tôi khi chúng được tạo. quá trình của tôi tất cả chạy một vòng lặp trong khi sử dụng bool chia sẻ như vậy:
while myC_bool: ...keep running...
tôi có thể sau đó chỉ cần chuyển đổi các bool để False
từ quá trình cha mẹ của tôi và tất cả các tiến trình con sẽ hoàn thành vòng lặp và thoát cuối cùng của họ.
Tôi đã được nhiều người biết và đã đọc trong tài liệu mà mọi người nên thử tránh sử dụng bộ nhớ dùng chung khi sử dụng đa xử lý. Tôi đã nói với cách tốt nhất để tránh điều này là để daemonize quá trình, cung cấp cho nó một xử lý tín hiệu tùy chỉnh và gửi nó một sigint/sigterm/etc ...
Câu hỏi của tôi là, là độc quyền sử dụng bool để giữ một vòng lặp sống và CHỈ bao giờ thay đổi giá trị của nó từ quá trình cha mẹ của tôi, và đọc nó từ nhiều tiến trình con một giải pháp thích hợp để làm cho tất cả các quy trình con của tôi chấm dứt nhanh chóng và an toàn? Tôi cảm thấy như có ít chi phí cho tất cả các trẻ em chỉ cần nhìn vào một bool chia sẻ, hơn là gửi x số sigints cho họ.
Daemonizing có phải là giải pháp tốt hơn không? Nếu vậy tôi muốn một số giúp hiểu tại sao.
Cảm ơn bạn đã phản hồi, tôi đánh giá cao sự phê bình về phương pháp tôi đang sử dụng. Tôi đã bỏ qua một thực tế rằng mặc dù họ đang trong các quá trình khác nhau, họ vẫn phải có được một khóa để xem giá trị. Tôi có đúng trong suy nghĩ một lý do để tránh các giá trị được chia sẻ là bởi vì nó làm cho các quy trình giống như luồng hơn, cản trở một số lợi thế của việc sử dụng nhiều quy trình? – LISTERINE
@LISTERINE: Tôi chưa bao giờ nghĩ về nó theo cách đó, nhưng vâng, đó là một cách hay để xem nó. Những bất lợi lớn đối với các chủ đề là các giá trị được chia sẻ (có thể thay đổi) khó hơn lý do hơn là truyền thông điệp, và lập trình đồng thời là đủ cứng mà không cần suy nghĩ về chủng tộc. Nhược điểm cụ thể của CPython là GIL có nghĩa là mã luồng vốn vốn đã được đồng bộ hóa quá mức và kết thúc lên gần như nối tiếp thay vì song song. Giá trị được chia sẻ rõ ràng không tệ như chia sẻ tiềm ẩn và khóa xung quanh một giá trị không tệ bằng GIL, nhưng chúng quay lại những nhược điểm của luồng. – abarnert
@ LISTERINE:… Điều đó đang được nói, điều đáng nói đến là các tính năng này tồn tại vì một lý do: Đôi khi bắt đầu với đa xử lý và thực hiện một bước tiến tới luồng là một câu trả lời tốt hơn nhiều so với (a) bắt đầu với luồng và cố gắng di chuyển ra khỏi nó, hoặc (b) tổ chức lại toàn bộ thuật toán của bạn để nó có thể được mã hóa mà không cần chia sẻ. – abarnert