Разъяснение. В соответствии с некоторыми комментариями я должен уточнить, что это предназначено как простая структура, позволяющая выполнять программы, которые являются естественно параллельными (так называемые неловко параллельные программы). Это не будет и никогда не будет решением для задач, требующих связи или синхронизации между процессами.
Я искал простую среду параллельного программирования на основе процессов на Python, которая может выполнять функцию на нескольких процессорах в кластере, причем основным критерием является то, что он должен иметь возможность выполнять немодифицированный код Python. Ближайший я нашел Parallel Python, но pp делает некоторые довольно забавные вещи, которые могут привести к тому, что код не будет выполнен в правильном контексте (с соответствующие модули импортируются и т.д.).
Наконец-то я устал от поиска, поэтому решил написать свое. То, что я придумал, на самом деле довольно простое. Проблема в том, что я не уверен, что то, что я придумал, просто, потому что я не мог придумать много чего. Вот что делает моя программа:
- У меня есть сервер заданий, который передает задания узлам в кластере.
-
Работы передаются серверам, слушающим узлы, передавая словарь, который выглядит следующим образом:
{ 'moduleName':'some_module', 'funcName':'someFunction', 'localVars': {'someVar':someVal,...}, 'globalVars':{'someOtherVar':someOtherVal,...}, 'modulePath':'/a/path/to/a/directory', 'customPathHasPriority':aBoolean, 'args':(arg1,arg2,...), 'kwargs':{'kw1':val1, 'kw2':val2,...} }
-
moduleName
иfuncName
являются обязательными, а остальные необязательны. -
Сервер node принимает этот словарь и выполняет следующие действия:
sys.path.append(modulePath) globals()[moduleName]=__import__(moduleName, localVars, globalVars) returnVal = globals()[moduleName].__dict__[funcName](*args, **kwargs)
-
При получении возвращаемого значения сервер отправляет его обратно на сервер заданий, который помещает его в потокобезопасную очередь.
- Когда возвращается последнее задание, сервер задания записывает вывод в файл и завершает работу.
Я уверен, что есть недостатки, которые нужно отработать, но есть ли что-то очевидное в этом отношении? На первый взгляд он кажется надежным, требуя только того, чтобы узлы имели доступ к файловой системе (ей), содержащей файл .py и зависимости. Использование __import__
имеет то преимущество, что код в модуле автоматически запускается, поэтому функция должна выполняться в правильном контексте.
Приветствуются любые предложения или критика.
EDIT: Я должен упомянуть, что у меня есть бит выполнения кода, но сервер и сервер заданий еще не записаны.