2011-06-20 8 views
6

मैंने एक परीक्षण कार्यक्रम लिखा, जिसमें दो प्रक्रियाएं हैं। पिता की प्रक्रिया एक कतार से डेटा प्राप्त करती है, और बच्चा इसमें डेटा डालता है। एक सिग्नल हैंडलर है जो कार्यक्रम से बाहर निकलने के लिए कहता है। हालांकि, यह कभी-कभी बाहर नहीं निकलता है जब मैं सिग्नल SIGTERM को मुद्रित पिड (बाल प्रक्रिया) में भेजता हूं, और ऐसा लगता है कि यह एक डेडलॉक है।यह पाइथन प्रोग्राम कभी-कभी बाहर निकलने में विफल क्यों होता है?

import os 
import sys 
import multiprocessing 
import time 
import signal 

bStop = False 
def worker(que): 
    signal.signal(signal.SIGTERM,sighandler) 
    print 'worker:',os.getpid() 
    for i in range(100000000): 
     que.put(i) 

    print 'STOP' 

def sighandler(num,frame): 
    print 'catch signal' 
    q.put('STOP') 
    sys.exit(0) 
q = multiprocessing.Queue(100) 
p = multiprocessing.Process(target=worker,args=(q,)) 
p.start() 

for item in iter(q.get,'STOP'): 
    print 'get',item 
    pass 
print 'main stop' 
p.join() 
+0

वाह ... 100,000,000 के साथ आप उस सीमा के बारे में मजाक नहीं कर रहे थे, क्या आप थे? – cwallenpoole

+0

@cwallenpoole मैं बस इसे लंबे समय तक चलाना चाहता हूं .... – renenglish

+0

ठीक है, यह 20 मिनट तक पृष्ठभूमि में चल रहा है और अभी तक 50,000,000 तक नहीं मिला है – cwallenpoole

उत्तर

1

जब तक आप पाइथन 3 नहीं चला रहे हैं तो आपको बड़े लूप के लिए श्रेणी के बजाय xrange का उपयोग करना चाहिए। एक निश्चित सूची आकार से अधिक होने के बाद पाइथन चकित हो जाता है और इसलिए आपको वास्तव में उस बिंदु से जेनरेटर में स्थानांतरित करने की आवश्यकता होती है।

यह अभी भी आपके विचार को देखकर बहुत अच्छा हो सकता है।

संबंधित मुद्दे