Чтение стандартного вывода с подчиненных узлов с помощью ipcluster - PullRequest
4 голосов
/ 22 марта 2012

Я настроил кластер с помощью

ipcluster start --n=8

, затем получил доступ к нему с помощью

from IPython.parallel import Client
c=Client()
dview=c[:]
e=[i for i in c]

Я запускаю процессы на подчиненных узлах (e [0] -e [7]), которые занимают много времени, и я хотел бы, чтобы они отправляли отчеты о ходе работ мастеру, чтобы я мог следить за их проделкой.

Есть два способа, которые я могу сделатьэто, но до сих пор я не смог реализовать ни один из них, несмотря на часы обхода страниц с вопросами.

Либо я хочу, чтобы узлы передавали некоторые данные мастеру без запроса.т. е. в длинном процессе, который выполняется на узлах, я реализую функцию, которая через регулярные промежутки времени передает свой ход мастеру.

Или я мог бы перенаправить стандартный вывод узлов на тот, что у мастера, а затем простоотслеживать прогресс с помощью печати.Это то, над чем я работаю до сих пор.У каждого узла есть свой стандартный вывод, поэтому print ничего не делает, если работает удаленно.Я пытался протолкнуть sys.stdout к узлам, но это просто закрывает его.

Не могу поверить, что я единственный человек, который хочет это сделать, поэтому, возможно, я упускаю что-то очень простое.Как я могу отслеживать длинные процессы, происходящие удаленно с помощью ipython?

1 Ответ

4 голосов
/ 23 марта 2012

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

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

В самом Клиенте вы можете проверить диктат метаданных для stdout / err (Client.metadata[msg_id].stdout) до получения результатов. Используйте Client.spin() для удаления любых входящих сообщений из сокетов zeromq, чтобы обеспечить актуальность этих данных.

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

...