У меня есть многопоточное приложение Java, которое вызывает Python программу через Runtime.exec()
. Это отлично работает. Теперь я хотел, чтобы каждый Java -Thread запускал свой собственный процесс Python для параллелизма. Пока это работает, я столкнулся с проблемой, заключающейся в том, что все процессы Python ограничиваются одним процессором, и поэтому каждый процесс использует только часть процессора для запуска. В top
я вижу мои n
Python процессы. При n=1
процесс использует 100% ЦП. При n=2
оба процесса используют примерно 50% ЦП. С n=10
все процессы используют около 10% ЦП.
В htop
я вижу, что используются только два ЦП: один для 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
- это нить, печатающая канал ошибок. Связь с процессом осуществляется по входным и выходным потокам bis
и bos
.
Я делаю это для каждой Java -потока. И это работает отлично. За исключением того, что Python процессы, кажется, совместно используют один ЦП.