2009-05-19 9 views
7

मैं पाइथन में एक सरल एकाधिक प्रक्रिया अनुप्रयोग चलाने की कोशिश कर रहा हूं। मुख्य धागा 1 से एन प्रक्रियाओं को जन्म देता है और जब तक वे सभी प्रसंस्करण नहीं करते हैं तब तक प्रतीक्षा करते हैं। प्रक्रियाओं को एक अनंत लूप चलाने के लिए, ताकि वे संभवतः बिना कुछ उपयोगकर्ता रुकावट हमेशा के लिए चला सकते हैं, तो मैं कुछ कोड एक KeyboardInterrupt संभाल करने में डाल दिया:पायथन मल्टीप्रोसेसिंग अयोग्य त्रुटि "atexit._run_exitfuncs में त्रुटि"

#!/usr/bin/env python 
import sys 
import time 
from multiprocessing import Process 

def main(): 
    # Set up inputs.. 

    # Spawn processes 
    Proc(1).start() 
    Proc(2).start() 

class Proc (Process): 
    def __init__ (self, procNum): 
     self.id = procNum 
     Process.__init__(self) 

    def run (self): 
     doneWork = False 

     while True: 

      try: 
       # Do work... 
       time.sleep(1) 
       sys.stdout.write('.') 

       if doneWork: 
        print "PROC#" + str(self.id) + " Done." 
        break 

      except KeyboardInterrupt: 
       print "User aborted." 
       sys.exit() 

# Main Entry 
if __name__=="__main__": 
    main() 

समस्या है का उपयोग करते समय CTRL-C बाहर निकलने के लिए है कि, मैं प्रक्रियाओं को तत्काल बाहर निकलने के बावजूद अतिरिक्त त्रुटि प्राप्त करें:

......User aborted. 
Error in atexit._run_exitfuncs: 
Traceback (most recent call last): 
    File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function 
    p.join() 
    File "C:\Python26\lib\multiprocessing\process.py", line 119, in join 
    res = self._popen.wait(timeout) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait 
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs) 
KeyboardInterrupt 
Error in sys.exitfunc: 
Traceback (most recent call last): 
    File "C:\Python26\lib\atexit.py", line 24, in _run_exitfuncs 
    func(*targs, **kargs) 
    File "C:\Python26\lib\multiprocessing\util.py", line 281, in _exit_function 
    p.join() 
    File "C:\Python26\lib\multiprocessing\process.py", line 119, in join 
    res = self._popen.wait(timeout) 
    File "C:\Python26\lib\multiprocessing\forking.py", line 259, in wait 
    res = _subprocess.WaitForSingleObject(int(self._handle), msecs) 
KeyboardInterrupt 

मैं विंडोज पर पायथन 2.6 चला रहा हूं। यदि पाइथन में मल्टीप्रोसेसिंग को संभालने का बेहतर तरीका है, तो कृपया मुझे बताएं।

उत्तर

1

इसके बजाय बस sys.exit() को मजबूर करना, आप उन्हें रोकने के लिए अपने धागे को एक सिग्नल भेजना चाहते हैं। signal handlers और पायथन में धागे का उपयोग करने में देखें।

आप while True: लूप को while keep_processing: पर बदलकर संभावित रूप से ऐसा कर सकते हैं, जहां keep_processing कुछ प्रकार का वैश्विक चर है जो कीबोर्ड इंटरप्ट अपवाद पर सेट हो जाता है। मुझे नहीं लगता कि यह एक अच्छा अभ्यास है हालांकि।

+0

यदि संभव हो, तो क्या आप इस समाधान का एक रननेबल उदाहरण जोड़ सकते हैं। – cmcginty

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