我正在尝试用Python运行一个简单的多进程应用程序。主线程产生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我在Windows上运行Python 2.6。如果有更好的方法在Python中处理多进程,请让我知道。
发布于 2009-05-19 15:36:10
不只是强制sys.exit(),您想要向线程发送一个信号,告诉它们停止。研究在Python语言中使用signal handlers和线程。
您可以通过将while True:循环更改为while keep_processing:来实现此目的,其中keep_processing是在KeyboardInterrupt异常上设置的某种全局变量。不过,我不认为这是一个好的做法。
发布于 2021-08-03 15:30:26
这是一个非常古老的问题,但似乎公认的答案实际上并没有解决这个问题。
主要问题是,您还需要在父进程中处理键盘中断。此外,在while循环中,您只需退出循环,不需要调用sys.exit()
我已尝试与原始问题中的示例尽可能接近。doneWork代码在示例中没有做任何事情,所以为了清楚起见,我删除了它。
import sys
import time
from multiprocessing import Process
def main():
# Set up inputs..
# Spawn processes
try:
processes = [Proc(1), Proc(2)]
[p.start() for p in processes]
[p.join() for p in processes]
except KeyboardInterrupt:
pass
class Proc(Process):
def __init__(self, procNum):
self.id = procNum
Process.__init__(self)
def run(self):
while True:
try:
# Do work...
time.sleep(1)
sys.stdout.write('.')
except KeyboardInterrupt:
print("User aborted.")
break
# Main Entry
if __name__ == "__main__":
main()https://stackoverflow.com/questions/883370
复制相似问题