我有一个多线程Java应用程序,它通过Runtime.exec()
调用Python程序。这个很好用。我现在希望每个Java线程启动自己的Python进程以实现并发性。
在这个过程中,我遇到了一个问题,即所有Python进程似乎都将自己限制在一个CPU上,因此每个进程只使用部分CPU来运行。在top
中,我可以看到我的n
Python进程。
使用n=1
,进程使用100%的CPU。
对于n=2
,两个进程都使用大约50%的CPU。
使用n=10
,所有进程都使用大约10%的CPU
在{
我认为运行多个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
是打印出错误通道的线程。与进程的通信通过bis
和bos
输入和输出流运行
我对每个Java线程都这样做。而且效果很好。除了Python进程似乎共享一个CPU之外
线程共享父进程的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问题。对此,我深表歉意,并将在今后努力澄清我的问题
相关问题 更多 >
编程相关推荐