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ć:
<code>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()) </code>
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.