在线程之间同步清理过程

时间:2010-12-13 20:30:32

标签: python multithreading thread-safety

我正在计划一个基于Python线程的项目。 每个线程都需要使用subprocess.Popen运行外部程序并收集一些输出。

作为副作用,外部程序可能会离开:

  • 临时文件
  • Zombie Process

我无法为每个线程运行此清理,因为我没有办法将线程关联到其外部程序PID(此程序启动另一个程序)并且它是临时文件。

我正在寻找清理临时文件的最佳方法+杀死僵尸进程(我可以通过名称而不是通过PID找到它)在所有线程完成一次迭代之后,就在下一次迭代之前启动。

我知道这种清理会阻止所有线程,直到最后一个完成,但我可以忍受这种延迟。

你能提供一个简短的代码片段来证明这样的清理工作吗?

1 个答案:

答案 0 :(得分:1)

好的,你真的有两件事需要注意:

  • 在工作线程完成一轮迭代之前,不得开始清理
  • 在清理完成之前,工作线程不得启动下一次迭代。

我认为最好的方法是给每个工作线程一对事件(threading.Event()),readycleanup和cleanupfinished。然后在工作线程中:

# ... main operation
self.readycleanup.set() # Still within loop
self.cleanupfinished.wait()
self.cleanupfinished.clear()
# End of loop

同时,在清理线程中:

for worker in workerthreads:
    worker.readycleanup.wait()
do_cleanup_stuff()
for worker in workerthreads:
    worker.readycleanup.clear()
    worker.cleanupfinished.set()