如何使用python的多处理池处理KeyboardInterrupt事件?这是一个简单的例子:
from multiprocessing import Pool
from time import sleep
from sys import exit
def slowly_square(i):
sleep(1)
return i*i
def go():
pool = Pool(8)
try:
results = pool.map(slowly_square, range(40))
except KeyboardInterrupt:
# **** THIS PART NEVER EXECUTES. ****
pool.terminate()
print "You cancelled the program!"
sys.exit(1)
print "\nFinally, here are the results: ", results
if __name__ == "__main__":
go()
Run Code Online (Sandbox Code Playgroud)
当运行上面的代码时,KeyboardInterrupt当我按下时会引发上升^C,但是该过程只是挂起,我必须在外部杀死它.
我希望能够随时按下^C并使所有进程正常退出.
我意识到我可以使用 Pool 类并可能得到我需要的东西,但我想要更好地控制我的问题。我的工作比处理器多,所以我不希望它们同时运行。
例如:
from multiprocessing import Process,cpu_count
for dir_name in directories:
src_dir = os.path.join(top_level,dir_name)
dst_dir = src_dir.replace(args.src_dir,args.target_dir)
p = Process(target=transfer_directory, args=(src_dir, dst_dir,))
p.start()
Run Code Online (Sandbox Code Playgroud)
但是,如果我有超过 16 个目录,那么我将启动比处理器更多的作业。这是我的解决方案,它真的很黑客。
from multiprocessing import Process,cpu_count
jobs = []
for dir_name in directories:
src_dir = os.path.join(top_level,dir_name)
dst_dir = src_dir.replace(args.src_dir,args.target_dir)
p = Process(target=transfer_directory, args=(src_dir, dst_dir,))
jobs.append(p)
alive_jobs = []
while jobs:
if len(alive_jobs) >= cpu_count():
time.sleep(5)
print alive_jobs
for aj in alive_jobs:
if aj.is_alive():
continue
else:
print "job {} removed".format(aj)
alive_jobs.remove(aj)
continue
for job in jobs: …Run Code Online (Sandbox Code Playgroud)