Я работаю над довольно большим проектом на 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.