Python'da oldukça büyük bir proje üzerinde çalışıyorum; bu işlem, temel hizmetin yavaşlatılmaması için, hesaplama yoğun arka plan görevlerinden birinin başka bir çekirdeğe yüklenmesini gerektirir. Çalışan işlemin sonuçlarını iletmek için multiprocessing.Queue
kullanırken bazı garip davranışlarla karşılaştım. Karşılaştırma amacıyla hem threading.Thread
hem de multiprocessing.Process
için aynı kuyruğu kullanarak, iş parçacığı gayet iyi çalışır ancak işlem kuyruğa büyük bir öğe ekledikten sonra katılamaz. Gözlemleyin: Ben bu size = 10000
için çalışıyor, ancak size = 100000
için worker_p.join()
de asılı gördüğümÇok işlem için maksimum boyut. Sıra öğesi?
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())
. multiprocessing.Process
örneklerinin multiprocessing.Queue
içine koyabildiği bazı içsel boyut sınırı var mı? Yoksa burada bariz, temel bir hata mı yapıyorum?
Referans için, Ubuntu 10.04 üzerinde Python 2.6.5 kullanıyorum.
Teşekkürler, bu tam olarak karşılaştığım sorun ve katılmadan önce ebeveyn iş parçasında yapılan dequeuing iyi çalışıyor gibi görünüyor. –
çok teşekkür ederim. sadece 2 satır değiştirme: "worker_t.join() yazdırma 'iş parçacığı uzunluğu:', len (queue.get())" – Catbuilts