如何从Java启动独立的、同时运行的Python进程



我有一个多线程Java应用程序,它通过Runtime.exec()调用Python程序。这很好用。我现在希望每个Java线程都能启动自己的Python进程以实现并发。在工作过程中,我遇到了一个问题,即所有Python进程似乎都将自己限制在一个CPU内,因此每个进程只使用部分CPU来运行。在top中,我可以看到我的nPython进程。对于n=1,进程使用100%的CPU。对于n=2,两个进程都使用大约50%的CPU。使用n=10,所有进程使用大约10%的CPU。

htop中,我可以看到只使用了两个CPU:一个用于Java,另一个用于Python。

我认为运行多个Python进程可以使它们完全独立地运行。

想法和提示?非常感谢。

编辑:这是导致创建Python进程的代码。这不是一个简单的例子。如果这还不够清楚,我会创建一个。

ProcessBuilder builder = new ProcessBuilder(new String[]{"-u", "-c", script});
process = builder.start();
errorStreamConsumer = new
ErrorStreamConsumer(process.getErrorStream(), options.getTerminationSignalFromErrorStream(), Thread.currentThread());
errorStreamConsumer.start();
log.debug("Started process with arguments {}", Arrays.toString(arguments));
BufferedInputStream bis = new BufferedInputStream(process.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(process.getOutputStream());

其中script是作为字符串的完整Python脚本(不是文件名,而是实际的Python代码(,ErrorStreamConsumer是打印错误通道的线程。与进程的通信通过bisbos输入流和输出流运行。

我为每个Java线程都这样做。而且效果很好。除了Python进程似乎共享一个CPU之外。

首先:感谢所有关心我问题的人。

虽然我对自己问题的真实性质感到有点羞愧,但我觉得我应该分享这个问题是什么。

我用SLURM运行了我的程序,这是一个作业调度程序,它也能够限制CPU的使用。在我的情况下,它限制我的程序使用单个CPU。因此,从定义上讲,从未使用过更多的CPU。

现在我意识到我对Python并发性没有任何问题。更具体地说:将脚本传递给Python解释器的-c参数在这里不是问题。此外,基兰的思想在这里不适用。我有一个Java进程和多个从Java进程开始的Python进程,现在它们消耗的CPU容量都和我给它们的一样多(我只有3 x 300%的CPU使用率来自Python进程(。

所以这里真正的问题是我认为这将是一个Python问题。对此我深表歉意,今后我会尽量澄清我的问题。

线程共享父进程的cpu。如果我们有5个线程,这并不意味着我们可以使用所有的5个核心,每个线程将共享主父进程的cpu/核心。在您的案例中,10个线程共享100%的cpu,因此每个线程都有10%的cpu。现在每个线程都在运行一个cpu为10%的python代码,因此这就是python的计算能力。我建议你多处理而不是多线程。就像,每个java进程启动一个python进程,您可以部署多个java实例。

最新更新