如何从Java启动独立、并发运行的Python进程

2024-10-03 23:30:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在{}中,我可以看到只使用了两个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之外


Tags: 代码new进程builderscriptjavacpu线程
2条回答

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

首先:感谢所有想到我这个问题的人

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

我用SLURM运行我的程序,SLURM是一个作业调度器,它也可以限制CPU的使用。在我的例子中,它限制我的程序使用单个CPU。因此,根据定义,从未使用过更多的CPU

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

所以这里真正的问题是我的假设,这将是一个Python问题。对此,我深表歉意,并将在今后努力澄清我的问题

相关问题 更多 >