بيثون متعدد المعالجة خطأ atexit "خطأ في atexit._run_exitfuncs"

StackOverflow https://stackoverflow.com/questions/883370

سؤال

وأنا أحاول أن تشغيل بسيط تطبيق عمليات متعددة في بيثون. مؤشر الترابط الرئيسي يولد 1 إلى عمليات N وينتظر حتى يتم تجهيز جميع. عمليات تشغيل كل حلقة لا نهائية، حتى يتمكنوا من المحتمل أن تشغيل إلى الأبد دون انقطاع بعض المستخدمين، لذلك أنا وضعت في بعض رمز للتعامل مع KeyboardInterrupt:

#!/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 على ويندوز. إذا كان هناك طريقة أفضل للتعامل مع متعدد المعالجة في بيثون، واسمحوا لي أن أعرف.

هل كانت مفيدة؟

المحلول

وبدلا من مجرد إجبار sys.exit()، وتريد أن ترسل إشارة إلى المواضيع الخاصة بك لنقول لهم بالتوقف. النظر في استخدام معالجات إشارة والمواضيع في بيثون.

هل يمكن أن يحتمل القيام بذلك عن طريق تغيير حلقة while True: ليتم while keep_processing: حيث keep_processing هو نوع من المتغير العالمي الذي يحصل تعيين على استثناء KeyboardInterrupt. أنا لا أعتقد أن هذا هو ممارسة جيدة على الرغم من.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top