R, Python и pyRserve - многопоточные примеры?
У меня есть сценарий Python, в котором он создает Rserve, устанавливает несколько R-сценариев и функций, а затем запускает некоторые данные для этих функций. Однако мне не удалось создать многопоточный экземпляр этого же процесса. Моя основная проблема в том, что один поток всегда доминирует в обработке, а все остальные потоки игнорируются.
Я сделал предположение, что pyRserve может быть многопоточным - это правильное предположение? Существуют ли примеры, демонстрирующие это как многопоточное приложение?
1 ответ
Я предполагаю, что вы использовали компьютер с Windows. В разделе новостей Rserve говорится о самой последней версии (1.8-6), которая
Настоятельно не рекомендуется использовать Windows, учитывая, насколько ограничена операционная система и как она предотвращает любое разумное использование (Windows поддерживает только однопользовательский, однопоточный, кооперативный режим - так что только для игрушек).
На веб-странице Rserve есть больше заметок по Windows:
Поскольку операционная система Windows не поддерживает метод fork для порождения копий процесса, невозможно инициализировать R и использовать инициализированные копии для всех последующих соединений параллельно. Поэтому Rserve for Windows не поддерживает одновременных подключений. Это подразумевает, что все последующие соединения совместно используют одно и то же пространство имен, и сеансы (как в версии>=0.4 в unix) не поддерживаются. Все еще возможно запустить несколько резервов для обработки нескольких соединений (просто убедитесь, что вы используете разные порты для каждого из них).
Тем не менее, я получил его на Windows с версией Rserve, которая поставляется с deployr-rserve (без необходимости использовать несколько процессов, работающих на разных портах). Похоже, этот форк основан на Rserve 0.6-3.1 - так что он довольно устарел...
Я продолжал работать с кодом, и оказалось, что каждому потоку нужен собственный порт для работы. Я нигде не нашел этого документированного, я просто пробовал другую идею. Так:
- Я настроил столько экземпляров Rserve, сколько я хотел потоков. У каждого из этих экземпляров был свой порт
- В моем коде python, когда я создал экземпляр объекта pyRserve, я назначил ему уникальный номер порта.
Многопоточность теперь работает как нужно и быстро!