2012-04-05 26 views
11

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.

cevap

16

Altta bulunan borunun dolu olması nedeniyle, besleyici iplik borunun üzerine yazma işlemini engeller (aslında, boruyu eşzamanlı erişimden koruyan kilidi almayı denerken).

Kontrol bu konunun http://bugs.python.org/issue8237

+2

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. –

+1

ç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

İlgili konular