Образец программы зависает

TL;DR: я не могу получить самое основное dispy пример кода для правильной работы. Почему бы и нет?

Детали:

Я пытаюсь перейти к распределенной обработке в python, и мне показалось, что библиотека dispy звучит интересно из-за обширного набора функций.

Тем не менее, я пытался следовать их основному примеру канонической программы, и я ничего не получаю.

  • Я установил диспи (python -m pip install dispy)
  • Я перешел на другую машину с тем же адресом подсети и побежал python dispynode.py, Кажется, работает, как я получаю следующий вывод:

    2016-06-14 10:33:38 dispynode - версия dispynode 4.6.14
    2016-06-14 10:33:38 asyncoro - версия 4.1 с уведомлением epoll I/O
    2016-06-14 10:33:38 dispynode - отбывает 8 процессоров в 10.0.48.54:51348

    Введите "выход" или "выход", чтобы завершить dispynode, "остановить", чтобы остановить
    service, "start" для перезапуска службы, "cpus" для изменения используемых процессоров,
    что-нибудь еще, чтобы получить статус:

  • Вернувшись на свою клиентскую машину, я запускаю образец кода, загруженный с http://dispy.sourceforge.net/_downloads/sample.py, скопированный здесь:


# function 'compute' is distributed and executed with arguments
# supplied with 'cluster.submit' below
def compute(n):
    import time, socket
    time.sleep(n)
    host = socket.gethostname()
    return (host, n)

if __name__ == '__main__':
    # executed on client only; variables created below, including modules imported,
    # are not available in job computations
    import dispy, random
    # distribute 'compute' to nodes; 'compute' does not have any dependencies (needed from client)
    cluster = dispy.JobCluster(compute)
    # run 'compute' with 20 random numbers on available CPUs
    jobs = []
    for i in range(20):
        job = cluster.submit(random.randint(5,20))
        job.id = i # associate an ID to identify jobs (if needed later)
        jobs.append(job)
    # cluster.wait() # waits until all jobs finish
    for job in jobs:
        host, n = job() # waits for job to finish and returns results
        print('%s executed job %s at %s with %s' % (host, job.id, job.start_time, n))
        # other fields of 'job' that may be useful:
        # job.stdout, job.stderr, job.exception, job.ip_addr, job.end_time
    cluster.print_status()  # shows which nodes executed how many jobs etc.

Когда я запускаю это (python sample.py), просто висит. Отладка через pdb, я вижу, что в конечном итоге висит на dispy/__init__.py(117)__call__(), Строка читает self.finish.wait(), отделка - это всего лишь поток Python, так как wait() затем идет в lib/python3.5/threading.py(531)wait(), Он зависает, как только попадает в ожидание.

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

cluster = dispy.JobCluster(compute, nodes=['localhost'])
cluster = dispy.JobCluster(compute, nodes=['*'])
cluster = dispy.JobCluster(compute, nodes=[<hostname of the remote node running the client>])

Я пытался бежать с cluster.wait() Линия без комментариев, и получил те же результаты.

Когда я добавил логи (cluster = dispy.JobCluster(compute, loglevel = 10)), Я получил следующий вывод на стороне клиента:

2016-06-14 10:27:01 asyncoro - версия 4.1 с уведомлением epoll I/O
2016-06-14 10:27:01 dispy - клиент dispy по адресу:51347 2016-06-14 10:27:01 dispy - хранение информации о восстановлении после сбоя в "_dispy_20160614102701"
2016-06-14 10:27:01 dispy - Ожидающие работы: 0
2016-06-14 10:27:01 dispy - Ожидающие работы: 1
2016-06-14 10:27:01 dispy - Ожидающие работы: 2
2016-06-14 10:27:01 dispy - Ожидающие работы: 3
2016-06-14 10:27:01 dispy - Ожидающие работы: 4
2016-06-14 10:27:01 dispy - Ожидающие работы: 5
2016-06-14 10:27:01 dispy - Ожидающие работы: 6
2016-06-14 10:27:01 dispy - Ожидающие работы: 7
2016-06-14 10:27:01 dispy - Ожидающие работы: 8
2016-06-14 10:27:01 dispy - Ожидающие работы: 9
2016-06-14 10:27:01 dispy - В ожидании работы: 10

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

Для чего это стоит, вот _dispy_20160614102701.bak:

'_cluster', (0, 207)
'compute_1465918021755', (512, 85)

и аналогично, _dispy_20160614102701.dir:

'_cluster', (0, 207)
'compute_1465918021755', (512, 85)

Я не догадываюсь, если не использую нестабильную версию.

4 ответа

При первой настройке и использовании dispy в сети я обнаружил, что мне нужно было указать IP-адрес клиентского узла при создании кластера заданий, см. Ниже:

cluster = dispy.JobCluster(compute, ip_addr=your_ip_address_here)

Посмотрите, поможет ли это.

Если вы просто запускаете sample.py на своем клиенте, измените следующее в своем основном утверждении:

cluster = dispy.JobCluster (вычислить, node =['nodeip_1','nodeip_2',.....,'nodeip_n])

Затем запустите его в вашей IDE или через оболочку.

Надеюсь, это поможет.

Перед выполнением python sample.py, dispynode.py должен по-прежнему работать на локальном хосте или другом компьютере (обратите внимание, что другой компьютер должен находиться в той же сети, если вы не хотите указывать сложные параметры).

Я столкнулся с той же проблемой и решил ее следующим образом:

  • откройте терминал и выполните: $ dispynode.py (не прекращайте это)
  • откройте второй терминал и выполните: $ python sample.py

Не забывайте, что функция compute состоит в ожидании определенного времени, выходы должны появиться как минимум через 20 секунд после выполнения sample.py.

попробуйте это вместо

  1. python /home/$user_name/.local/lib/python3.9/site-packages/dispy/dispynode.py
  2. python sample.py# это сработало для меня
Другие вопросы по тегам