2016-04-01 27 views
2

python2.7'de, çoklu işlem. Bir işlev içinden başlatıldığında, hatalı bir hata atar. Sorunu yeniden üreten minimal bir örnek sağlıyorum.Çoklu işlemle kırık boru hatası.Que

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import multiprocessing 

def main(): 
    q = multiprocessing.Queue() 
    for i in range(10): 
     q.put(i) 

if __name__ == "__main__": 
    main() 

aşağıda kırık boru hatayı

Traceback (most recent call last): 
File "/usr/lib64/python2.7/multiprocessing/queues.py", line 268, in _feed 
send(obj) 
IOError: [Errno 32] Broken pipe 

Process finished with exit code 0 

neden deşifre alamıyorum atar. Queue nesnelerini bir fonksiyonun içinden dolduramayacağımız kesinlikle garip olurdu. Burada olan sen main() çağırdığınızda, bu Queue oluşturduğu nedir

cevap

3

, içinde 10 nesneleri koymak ve Queue dahil iç değişkenler ve nesneler, tüm toplama fonksiyonu, çöp biter. AMA, bu hatayı alıyorsunuz, çünkü hala Queue numaralı telefona son numarasını göndermeye çalışıyorsunuz.

"bir işlem ilk olarak bir besleme ipliği boru içine bir tampon nesne transfer eden başlatılır sırasına bir madde koyar:" belgelerinde documentation den

put() gibi

Senaryoda yürütülmesini engelleme değil, başka Konuya yapılan ve hiç Kuyruk işlemleri tamamlamadan önce main() fonksiyonunu biter olanak tanır.

bu deneyin: nesne Queue konur kadar

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import multiprocessing 
import time 
def main(): 
    q = multiprocessing.Queue() 
    for i in range(10): 
     print i 
     q.put(i) 
    time.sleep(0.1) # Just enough to let the Queue finish 

if __name__ == "__main__": 
    main() 

join üzere Sıra veya blok yürütme bir yolu olmalı, belgelerde bir göz atmalısınız.

+0

'dan önce çağrılmalıdır. Harika yanıt. Python3'te bunun gerçekleşmediğini belirten bir tane daha vereceğim. – hAcKnRoCk

0

@HarryPotFleur tarafından önerilen şekilde time.sleep(0.1) kullanarak bir gecikmeyle, bu sorun çözüldü. Ancak kodu python3 ile test ettim ve kırık boru sorunu python3'te hiç olmadı. Bunun bir hata olarak bildirildiğini ve daha sonra düzeltildiğini düşünüyorum.

+0

Bu ** doğru değil **, o python3 hiç olmazsa. Daha fazla 'time.sleep (0.1)' değil çözmek! Sadece anlamak içindi! –

1

Queue.put() öğesini başlattığınızda, bir kuyruğa veri göndermek için örtük bir iş parçacığı başlatılır. Bu arada, ana uygulama bitti ve veri için bir bitiş istasyonu yok (kuyruk nesnesi çöp topladı).

bu denemek:

from multiprocessing import Queue 

def main(): 
    q = Queue() 
    for i in range(10): 
     print i 
     q.put(i) 
    q.close() 
    q.join_thread() 

if __name__ == "__main__": 
    main() 

join_thread() sağlar, tampon tüm veriler kızardı edilmiştir. close(), join_thread()

İlgili konular