Maksymalny rozmiar dla multiprocessingu.Kolejna pozycja?
Pracuję nad dość dużym projektem w Pythonie, który wymaga jednego z intensywnych obliczeniowo zadań w tle do przeniesienia do innego rdzenia, tak aby usługa główna nie była spowalniana. Podczas używania natknąłem się na jakieś pozornie dziwne zachowaniemultiprocessing.Queue
komunikować wyniki z procesu pracownika. Używanie tej samej kolejki dla obu athreading.Thread
i amultiprocessing.Process
dla celów porównawczych wątek działa dobrze, ale proces nie może się połączyć po umieszczeniu dużego elementu w kolejce. Przestrzegać:
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())
Widziałem, że to działa dobrzesize = 10000
, ale wisi naworker_p.join()
dlasize = 100000
. Czy jest jakiś nieodłączny limit wielkości tego, comultiprocessing.Process
instancje można umieścić wmultiprocessing.Queue
? A może popełniam tutaj oczywisty, fundamentalny błąd?
Dla odniesienia używam Pythona 2.6.5 na Ubuntu 10.04.