Как запустить независимые, одновременно запущенные Python процессы из Java - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть многопоточное приложение 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 процессы, кажется, совместно используют один ЦП.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Прежде всего: спасибо всем, кто задумался о моей проблеме.

Хотя мне немного стыдно за истинную природу моей проблемы, я чувствую, что должен поделиться тем, что было.

Я запустил свою программу с SLURM, планировщиком заданий, который также может ограничивать использование процессора. В моем случае это ограничило мою программу для использования одного процессора. Таким образом, больше процессоров никогда не использовались по определению.

Теперь, когда я понял, что у меня вообще нет проблем с Python параллелизмом. Чтобы быть более конкретным: параметр -c для передачи сценария интерпретатору Python здесь не является проблемой. Кроме того, идея Киран здесь не распространяется. У меня есть один Java Процесс и несколько Python процессов, запущенных из процесса Java, и теперь все они потребляют столько же ресурсов ЦП, сколько я бы им выделил (у меня только 3 х 300% использования ЦП из Python процессы).

Поэтому настоящей проблемой было мое предположение, что это будет Python проблема. Я прошу прощения за это и постараюсь прояснить мою проблему в будущем.

0 голосов
/ 07 апреля 2020

Потоки разделяют процессор родительского процесса. Если у нас есть 5 потоков, что не означает, что мы можем использовать все 5 ядер, которые у нас есть, каждый поток будет использовать общий процессор / ядро ​​основного родительского процесса. В вашем случае 10 потоков делили 100% процессоров, так что вы получили по 10% каждому. Теперь каждый поток выполняет код python с 10% процессором, следовательно, это вычислительная мощность, которую вы получили за python. Я предлагаю вам сделать многопоточность вместо многопоточности. Например, каждый java процесс запускает python процесс, и вы можете развернуть несколько экземпляров java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...