2012-04-05 41 views
11

Tôi đang làm việc trên một dự án khá lớn trong Python yêu cầu một trong các tác vụ nền chuyên sâu tính toán được tải xuống lõi khác, để dịch vụ chính không bị chậm lại. Tôi đã đi qua một số hành vi rõ ràng lạ khi sử dụng multiprocessing.Queue để truyền đạt kết quả từ quá trình công nhân. Sử dụng cùng một hàng đợi cho cả một số threading.Threadmultiprocessing.Process cho mục đích so sánh, luồng chỉ hoạt động tốt nhưng quy trình không tham gia được sau khi đặt một mục lớn trong hàng đợi. Quan sát:Kích thước tối đa cho đa xử lý.Queue mục?

import threading 
import multiprocessing 

class WorkerThread(threading.Thread): 
    def __init__(self, queue, size): 
     threading.Thread.__init__(self) 
     self.queue = queue 
     self.size = size 

    def run(self): 
     self.queue.put(range(size)) 


class WorkerProcess(multiprocessing.Process): 
    def __init__(self, queue, size): 
     multiprocessing.Process.__init__(self) 
     self.queue = queue 
     self.size = size 

    def run(self): 
     self.queue.put(range(size)) 


if __name__ == "__main__": 
    size = 100000 
    queue = multiprocessing.Queue() 

    worker_t = WorkerThread(queue, size) 
    worker_p = WorkerProcess(queue, size) 

    worker_t.start() 
    worker_t.join() 
    print 'thread results length:', len(queue.get()) 

    worker_p.start() 
    worker_p.join() 
    print 'process results length:', len(queue.get()) 

I have seen that này hoạt động tốt cho size = 10000, nhưng treo tại worker_p.join() cho size = 100000. Có giới hạn kích thước cố hữu nào đối với trường hợp multiprocessing.Process nào có thể đặt trong một số multiprocessing.Queue không? Hay tôi đang tạo ra một số lỗi cơ bản rõ ràng ở đây?

Để tham khảo, tôi đang sử dụng Python 2.6.5 trên Ubuntu 10.04.

Trả lời

16

Có vẻ như đường ống bên dưới đã đầy, vì vậy các luồng của bộ cấp liệu sẽ được ghi vào đường ống (thực sự khi cố gắng lấy khóa bảo vệ đường ống khỏi sự truy cập đồng thời).

Kiểm tra vấn đề này http://bugs.python.org/issue8237

+2

Cảm ơn, đó chính xác là vấn đề tôi đang gặp phải và xóa bỏ trong chuỗi gốc trước khi tham gia có vẻ hoạt động tốt. –

+1

cảm ơn bạn rất nhiều. chỉ cần hoán đổi 2 dòng: "worker_t.join() in 'độ dài kết quả luồng:', len (queue.get())" – Catbuilts

1

Câu trả lời cho python multiprocessing: some functions do not return when they are complete (queue material too big) thực hiện những gì bạn có thể có nghĩa là bởi "dequeuing" trước khi gia nhập" trong một thực hiện song song của một bộ tùy ý các chức năng, có giá trị trả lại được xếp hàng đợi.

này do đó cho phép bất kỳ kích thước nào của công cụ được đưa vào hàng đợi, do đó giới hạn bạn tìm thấy không bị cản trở.

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