Образец программы зависает
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.
попробуйте это вместо
- python /home/$user_name/.local/lib/python3.9/site-packages/dispy/dispynode.py
- python sample.py# это сработало для меня