在线程完成执行之前,如何返回在python中使用Thread开始的冗长进程的进程id

时间:2017-03-31 12:55:15

标签: python multithreading subprocess

如何在线程完成执行之前返回在Python中使用Thread启动的冗长进程的进程ID?

  1. 我正在使用Tkinter GUI,所以我无法在主线程上启动冗长的进程,所以我在一个单独的线程上启动一个。
  2. 线程又调用subprocess.popen。这个过程应该运行5-6个小时。
  3. 但是当我按下停止按钮时,我需要停止此进程,但我无法返回使用subprocess.popen创建的进程的进程ID。
  4. 有没有解决方案?

1 个答案:

答案 0 :(得分:0)

如果您正在使用subprocess.Popen简单地剥离另一个进程,则没有理由需要从另一个线程执行此操作。以这种方式创建的子流程不会阻止您的主线程。在子流程运行时,您可以继续执行其他操作。您只需保留对返回的Popen对象的引用。

Popen对象具有监视/与子进程交互所需的所有工具。您可以读取和写入其标准输入和输出(通过stdinstdout成员(如果使用PIPE创建);您可以监控stdinstdoutselect模块)的可读性/可写性;您可以使用poll检查子流程是否仍然存在,并使用wait获取其退出状态;您可以使用terminate(或kill来阻止它,具体取决于您希望的强烈程度)。

时,从另一个线程执行此操作可能是有利的 - 例如,如果您需要与子流程进行大量交互并在主线程中实现它将覆盖 - 使你的逻辑复杂化。在这种情况下,最好安排一种机制,通过该机制向您的另一方发出信号"监控"线程,它是时候关闭并允许监控线程在子流程上执行terminatekill