2012-03-28 19 views
51

Tài liệu cho mô-đun multiprocessing cho biết cách chuyển hàng đợi đến quá trình bắt đầu bằng multiprocessing.Process. Nhưng làm thế nào tôi có thể chia sẻ một hàng đợi với các quy trình công nhân không đồng bộ bắt đầu với apply_async? Tôi không cần tham gia năng động hoặc bất cứ điều gì khác, chỉ là một cách để các công nhân (liên tục) báo cáo kết quả của họ trở lại cơ sở.Chia sẻ hàng đợi kết quả trong một số quy trình

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    q = multiprocessing.Queue() 
    workers = pool.apply_async(worker, (33, q)) 

này không thành công với: RuntimeError: Queue objects should only be shared between processes through inheritance. Tôi hiểu ý nghĩa của điều này và tôi hiểu lời khuyên để kế thừa thay vì yêu cầu tẩy/tháo ghim (và tất cả các hạn chế Windows đặc biệt). Nhưng làm thế nào làm Tôi vượt qua hàng đợi theo cách hoạt động? Tôi không thể tìm thấy một ví dụ, và tôi đã thử một số lựa chọn thay thế thất bại theo nhiều cách khác nhau. Giúp đỡ xin vui lòng?

Trả lời

73

Hãy thử sử dụng multiprocessing.Manager để quản lý hàng đợi của bạn và để người dùng khác có thể truy cập vào hàng đợi của bạn.

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    m = multiprocessing.Manager() 
    q = m.Queue() 
    workers = pool.apply_async(worker, (33, q)) 
+0

Điều đó đã làm điều đó, cảm ơn! Đã xảy ra sự cố không liên quan với lệnh gọi async trong mã ban đầu của tôi, vì vậy tôi đã sao chép bản sửa lỗi cho câu trả lời của bạn. – alexis

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