2

我一直在这个问题上一段时间了,我无法解决它。我正在制作子进程,然后这些子进程打开更多进程(实际上是 selenium webdrivers )。webdriver很容易崩溃,所以我构建了这个分层系统,以便主进程可以生成子进程,并在需要时杀死/重新生成它们。

我面临的问题是,如果我运行主线程并按 Ctrl+C,所有的孩子和这些孩子的孩子(浏览器)都会死掉。但是,当我尝试以编程方式执行此操作时,无论是 ((Popen) proc).kill(),我都尝试过 SIGINT、SIGTERM。我试过了,.terminate,os.kill,os,killpg。无论我做什么,硒进程都不会死,但是当我按下 Ctrl+C 时,它们都会死。

代码:这是我制作线程的方法。这怎么会引起问题?

proc = subprocess.Popen( ["python" , module_path() + "/scraper.py"], stdout=subprocess.PIPE ,stdin=subprocess.PIPE)

所以我的主要问题是,有没有办法调用终端中发生的 Ctrl+C 效果。我最初尝试使用线程,但它们只是一直死锁(为什么我不知道,它们没有共享内存,没有依赖关系)。Python不是我的主要语言,任何帮助都是一种沉淀。

谢谢你。基兰

4

1 回答 1

2

最后我解决了。我更改了程序,以便有一个管理器进程和一个子进程。经理产生了几个孩子,孩子们产生了 selenium 浏览器。经理等待孩子崩溃,当孩子崩溃时,经理会杀死孩子,这会杀死硒进程。

proc =  subprocess.Popen( ["python" , path + "/pythonChild.py"], preexec_fn=os.setsid, stdout=subprocess.PIPE ,stdin=subprocess.PIPE)
os.killpg( proc.pid, 9 )

上面的代码只会创建并杀死它,但是通过添加 preexec 它会启动一个新的进程组,然后可以终止该进程组并杀死它的所有子进程。

希望这对某人有帮助!

于 2013-08-03T00:36:44.597 回答