Вопрос

Следующий код, кажется, не работает должным образом для меня. Требуется запуск PPServer на другом компьютере в вашей сети, например, со следующей командой:

ppserver.py -r -a -w 4

Как только этот сервер запущен, на моей машине я запустил этот код:

import pp
import time
job_server = pp.Server(ppservers = ("*",))
job_server.set_ncpus(0)
def addOneBillion(x):
    r = x
    for i in xrange(10**9):
        r+=1
    f = open('/home/tomb/statusfile.txt', 'a')
    f.write('finished at '+time.asctime()+' for job with input '+str(x)+'\n')
    return r

jobs = []
jobs.append(job_server.submit(addOneBillion, (1,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (2,), (), ("time",)))
jobs.append(job_server.submit(addOneBillion, (3,), (), ("time",)))

for job in jobs:
    print job()
print 'done'

Странная часть: просмотр /home/tomb/statusfile.txt, я вижу, что он написан несколько раз, как будто функция работает несколько раз. Я заметил это продолжение более часа раньше, и никогда не видел job() возврат.

Одергите: если я изменим количество итераций в определении TestFunc до 10 ** ** 8, функция просто работает один раз, и возвращает результат, как ожидается!

Похоже, какое -то состояние раса? Просто использование местных ядер работает нормально. Это с PP V 1.6.0 и 1.5.7.

Обновление: около 775 000 000: я получаю непоследовательные результаты: две задания повторяются один раз, на заканчивая первый раз.

Неделя спустя обновлена: я написал свой собственный модуль параллельного обработки, чтобы обойти это, и избегаю параллельного питона в будущем, если только кто-то не выясняет это - я соберусь к тому, чтобы посмотреть на него (на самом деле дайвинг в источник код) в какой-то момент.

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

Это было полезно?

Решение

Ответ от Багиры на форуме Parallel Python:

Сколько времени занимает расчет каждой работы? Посмотрите на переменную TRANSPORT_SOCKET_TIMEOUT в /usr/local/lib/yphon2.6/dist-packages/ptransport.py.

Может быть, ваша работа занимает больше времени, чем время в переменной выше. Увеличьте его ценность и попробуйте.

Оказывается, это была именно проблема. В моем приложении я использую PP в качестве пакета планировщика заданий, которые могут занять несколько минут, поэтому мне нужно настроить это. (по умолчанию было 30 лет)

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top