Написание основы параллельного программирования, что я пропустил? - PullRequest
16 голосов
/ 02 ноября 2010

Разъяснение : В соответствии с некоторыми комментариями, я должен пояснить, что это задумано как простая структура, позволяющая выполнять программы, которые естественно параллельны (так называемые смущающие параллели). программы). Это не является и никогда не будет решением для задач, которые требуют связи или синхронизации между процессами.

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

Любые предложения или критика будут с благодарностью.

РЕДАКТИРОВАТЬ: Я должен отметить, что у меня работает бит выполнения кода, но сервер и сервер заданий еще не написаны.

Ответы [ 2 ]

8 голосов
/ 02 ноября 2010

Я действительно написал что-то, что, вероятно, удовлетворяет ваши потребности: кувшин . Если это не решит ваши проблемы, я обещаю исправить все найденные ошибки.

Архитектура немного отличается: все работники запускают один и тот же код, но они эффективно генерируют похожий словарь и спрашивают центральный бэкэнд "это было выполнено?" Если нет, они запускают его (также есть механизм блокировки). Бэкэнд может быть просто файловой системой, если вы работаете в системе NFS.

5 голосов
/ 02 ноября 2010

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

например: поверхности пигмеев не травятся. Я должен преобразовать их в строки, сохранив их в объектах StringIO, а затем сбросив их по сети.

Если передаваемые вами данные (например, ваши аргументы) могут передаваться без страха, у вас не должно быть , что много проблем с сетевыми данными.

Еще одна вещь приходит на ум: что вы планируете делать, если компьютер внезапно «исчезает» во время выполнения задачи? возвращая данные? у вас есть план для повторной отправки задач?

...