2013-08-06 2 views
2

Я запускаю множество долговременных задач с отличной функциональностью # parallelization от IPython.Вывод в режиме реального времени из движков в IPython параллельно?

Как я могу получить вывод в реальном времени из stdout ipengines в моем клиенте IPython?

Например, я бегу dview.map_async(fun, lots_of_args) и fun отпечатки на стандартный вывод. Я хотел бы видеть результаты, как они происходят.

Я знаю про AsyncResult.display_output(), но это доступно только после все задачи завершены.

ответ

7

Вы можете видеть stdout тем временем, обратившись к AsyncResult.stdout, который вернет список строк, которые являются стандартными для каждого движка.

Простейший случай существо:

print ar.stdout 

Вы можете обернуть это в простой функции, которая печатает на стандартный вывод, пока вы ждете для AsyncResult выполнения:

import sys 
import time 
from IPython.display import clear_output 

def wait_watching_stdout(ar, dt=1, truncate=1000): 
    while not ar.ready(): 
     stdouts = ar.stdout 
     if not any(stdouts): 
      continue 
     # clear_output doesn't do much in terminal environments 
     clear_output() 
     print '-' * 30 
     print "%.3fs elapsed" % ar.elapsed 
     print "" 
     for eid, stdout in zip(ar._targets, ar.stdout): 
      if stdout: 
       print "[ stdout %2i ]\n%s" % (eid, stdout[-truncate:]) 
     sys.stdout.flush() 
     time.sleep(dt) 

example notebook, иллюстрирующий эту функцию.

Теперь, если вы используете старый IPython, вы можете увидеть искусственное ограничение на доступ к атрибуту stdout (ошибки «Неготовность результата»). Информация доступна в метаданных, так что вы все еще можете получить на него, пока задача не сделать:

rc.spin() 
stdout = [ rc.metadata[msg_id]['stdout'] for msg_id in ar.msg_ids ] 

Который по существу то же самое, что доступ ar.stdout атрибут делает.

+0

Awesome, спасибо много! Я очень ценю вашу работу над параллельным IPython и усилия, которые вы вложили в этот ответ. Отличная работа! – rodion

+1

Ноутбук должен быть, вероятно, обновлен, потому что 'any (stdouts)' вызывает исключение. : - / –

0

только в случае, если кто-то до сих пор борется с получать обычные печатающих выходов отдельных ядер:

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

asdf = dview.map_async(function, arguments) 

# initialize a stdout0 array for comparison 
stdout0 = asdf.stdout 

while not asdf.ready(): 
    # check if stdout changed for any kernel 
    if asdf.stdout != stdout0: 
     for i in range(0,len(asdf.stdout)): 
      if asdf.stdout[i] != stdout0[i]: 
       # print only new stdout's without previous message and remove '\n' at the end 
       print('kernel ' + str(i) + ': ' + asdf.stdout[i][len(stdout0[i]):-1]) 

       # set stdout0 to last output for new comparison 
       stdout0 = asdf.stdout 
    else: 
     continue 


asdf.get() 

выходы тогда будет что-то вроде:

kernel0: message 1 from kernel 0 
kernel1: message 1 from kernel 1 
kernel0: message 2 from kernel 0 
kernel0: message 3 from kernel 0 
kernel1: message 2 from kernel 0 
...