Пояснение : В соответствии с некоторыми комментариями, я должен пояснить, что это предназначено как простая структура для разрешить выполнение программ, которые естественно параллельны (так называемые недопустимо параллельные программы). Это не и никогда не будет решением для задач, требующих связи или синхронизации между процессами.
I ' Мы искали простую среду параллельного программирования на основе процессов на Python, которая могла бы выполнять функцию на нескольких процессорах в кластере, с основным критерием, заключающимся в том, что она должна иметь возможность выполнять неизмененный код Python. Самым близким, что я нашел, был Parallel Python , но pp делает некоторые довольно забавные вещи, которые могут привести к тому, что код не будет выполняться в правильном контексте (с соответствующими импортированными модулями и т.д.).
Мне наконец надоело искать, поэтому я решил написать свой. То, что я придумал, на самом деле довольно просто. Проблема в том, что я не уверен, что то, что я придумал, просто, потому что я многое не придумал. Вот что делает моя программа:
moduleName
и funcName
являются обязательными, остальные - необязательными.
Сервер узла берет этот словарь и выполняет:
sys.path.append (modulePath)
globals () [moduleName] = __ import __ (moduleName, localVars, globalVars)
returnVal = globals () [имя модуля] .__ dict __ [имя_функции] (* аргументы, ** kwargs)
Получив возвращаемое значение, сервер затем отправляет его обратно на сервер заданий, который помещает его в потокобезопасную очередь.
Я уверен, что есть мелочи, которые необходимо решить, но есть ли что-то очевидное неправильное в этом подходе? На первый взгляд, это кажется надежным, требуя только, чтобы узлы имели доступ к файловой системе (ам), содержащей файл .py и зависимости. Использование __ import __
имеет то преимущество, что код в модуле запускается автоматически, и поэтому функция должна выполняться в правильном контексте.
Мы будем очень благодарны за любые предложения или критику.
РЕДАКТИРОВАТЬ: Я должен упомянуть, что у меня работает бит выполнения кода, но сервер и сервер заданий еще не написаны.