بيثون متعدد المعالجة خطأ atexit "خطأ في atexit._run_exitfuncs"
سؤال
وأنا أحاول أن تشغيل بسيط تطبيق عمليات متعددة في بيثون. مؤشر الترابط الرئيسي يولد 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. أنا لا أعتقد أن هذا هو ممارسة جيدة على الرغم من.