Максимальный размер для многопроцессорной обработки. Элемент очереди?

Я работаю над довольно большим проектом на Python, который требует, чтобы одна из ресурсоемких фоновых задач была перенесена на другое ядро, чтобы основной сервис не замедлялся. Я столкнулся с явно странным поведением при использовании multiprocessing.Queueдля передачи результатов рабочего процесса. Используя одну и ту же очередь для threading.Threadи multiprocessing.Processдля сравнения, поток работает нормально, но процесс не может присоединиться после помещения большого элемента в очередь. . Обратите внимание:

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())

я видел, что это прекрасно работает для size = 10000, но зависает на worker_p.join()для size = 100000. Существует ли какой-то неотъемлемый предел размера того, что экземпляры multiprocessing.Processмогут помещать в multiprocessing.Queue? Или я делаю здесь какую-то очевидную фундаментальную ошибку?

Для справки: я использую Python 2.6.5 в Ubuntu 10.04.

16
задан Brendan Wood 5 April 2012 в 12:42
поделиться