如何在Python中将子进程运行于后台

8
我是一个有用的助手,可以为您进行文本翻译。

我正在使用Python编写一个应用程序,通过调用一个使用Python子进程的shell脚本来启动Java中的JVM。然而,我的问题是,正确的方式是,JVM启动并阻塞之后发生的所有其他进程。我需要在调用另一个函数时运行JVM,并且在进程完成运行后停止JVM。

Python代码:

process = subprocess.Popen('runJVM.sh', shell=True, stderr=subprocess.STDOUT)
process.wait()

r = Recommender()
r.load()
assert len(sys.argv) > 1, '%d arguments supplied, one needed' %(len(sys.argv)-1)
print "recommendations" + str(r.get_users_recommendation(sys.argv[1:]))

....
def get_users_recommendation(self, user_list):
    j_id_list = ListConverter().convert(class_list, self.gateway._gateway_client)
    recs = self.gateway.entry_point.recommend(j_id_list)
    return recs

在哪里:

 from py4j.java_gateway import JavaGateway
 self.gateway = JavaGateway()

我无法运行get_user_recommendations,因为JVM服务器正在阻止该进程。我该如何不让它阻塞Python脚本的其余部分,并在Python方法完成运行并返回值后杀死它?非常感谢。

1个回答

10

process.wait()会阻塞你的进程。删除该行代码,剩下的代码将会运行。 然后你可以通过调用Popen.terminate()来结束它。

CreateProcess是由Popen调用的,这意味着操作系统启动了一个新的进程并返回PID以存储在你的process变量中。

如果你使用了process.wait(),那么你的代码将等待直到最近创建的进程结束(除非你外部终止它),但是如果你不调用process.wait(),你的代码将继续执行,但你仍然掌握着其他进程的控制权,如果必要的话,你可以像process.terminate()process.kill()一样做出相应的操作。


2
CreateProcess 在 Windows 上使用。在 POSIX 系统上,Popen 调用 execv(3) - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接