Разъяснение : В соответствии с некоторыми комментариями, я должен пояснить, что это задумано как простая структура, позволяющая выполнять программы, которые естественно параллельны (так называемые смущающие параллели). программы). Это не является и никогда не будет решением для задач, которые требуют связи или синхронизации между процессами.
Я искал простую среду параллельного программирования на основе процессов в 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
являются обязательными, а остальные являются необязательными.
Узловой сервер берет этот словарь и делает:
sys.path.append(modulePath)
globals()[moduleName]=__import__(moduleName, localVars, globalVars)
returnVal = globals()[moduleName].__dict__[funcName](*args, **kwargs)
После получения возвращаемого значения сервер затем отправляет его обратно на сервер заданий, который помещает его в потокобезопасную очередь.
- Когда возвращается последнее задание, сервер заданий записывает вывод в файл и завершает работу.
Я уверен, что есть проблемы, которые нужно проработать, но есть ли что-то явно не так с этим подходом? На первый взгляд, он кажется надежным, требующим только того, чтобы узлы имели доступ к файловой системе (системам), содержащей файл .py и зависимости. Использование __import__
имеет то преимущество, что код в модуле запускается автоматически, поэтому функция должна выполняться в правильном контексте.
Любые предложения или критика будут с благодарностью.
РЕДАКТИРОВАТЬ: Я должен отметить, что у меня работает бит выполнения кода, но сервер и сервер заданий еще не написаны.