2012-03-22 2 views
4

Я создал кластер с помощьюЧтения стандартного вывода из подчиненных узлов с ipcluster

ipcluster start --n=8 

затем к нему доступ с помощью

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

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

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

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

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

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

ответ

4

stdout уже зафиксирован, зарегистрирован и отслежен, и прибывает к Клиентам, когда дело доходит до того, как результат будет завершен.

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

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

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

+0

Спасибо, что я только что это сделал. –

Смежные вопросы