Загадочная проблема с параллельным Python - TRANSPORT_SOCKET_TIMEOUT - PullRequest
2 голосов
/ 05 ноября 2010

Следующий код не работает для меня должным образом.Это требует запуска 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().

Odder: Если я изменю количество итераций в определении testfunc на 10 ** 8, функция просто запускается один раз и возвращает ожидаемый результат!

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

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

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

Месяц спустя обновление: не осталось обид, Parallel Python.Я планирую вернуться назад, как только у меня будет время для переноса моего приложения.Редактирование заголовка для отражения решения.

Ответы [ 2 ]

2 голосов
/ 11 января 2011

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

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

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

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

1 голос
/ 17 ноября 2010

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

...