1

Надеюсь, это довольно простой вопрос для ответа. Я пытаюсь постоянно отправлять массив данных в рабочий процесс во время выполнения моей программы. Проблема в том, что когда я пытаюсь присоединиться к потоку, программа просто зависает.Подпроцесс Python, подвешенный после присоединения

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

Вот фрагмент моего кода. Я пытаюсь обойти крупные операции травления с помощью рабочего таким образом, так как раньше я сталкивался с проблемами надстройки с объектом Queue.

# Outside of the class definition if that matters here... 
def RunTimeWorker(conn, timestep, total_timesteps): 
    print "Start worker", timestep, total_timesteps 
    while (timestep < total_timesteps): 
    data = conn.recv() 
    timestep = data[0] 
    print timestep, "DATA [" + str(data) 
conn.close() 
print "End worker" 

И методы класса, назвав его:

def Execute(self): 
    parent_conn, child_conn = Pipe() 
    p = Process(target=RunTimeTestingWorker,args=(child_conn,0,300)) 
    p.start() 

    for timestep in xrange(300): 
    ... 
    # Send required data over to worker 
    toProcessArr = [timestep,300, 
     # trace data 
     ...,...] 
    parent_conn.send(toProcessArr) 
    ... 
    p.join # program hangs here 

    #p.join -- program will hang at end if join is commented 

Вот мой временный шаг успешно обновляя ...

Start worker 0 300 
0 DATA [[0, 300, ...] 
1 DATA [[1, 300, ...] 
2 DATA [[2, 300, ...] 
... 
299 DATA [[299, 300, ...] # max timesteps are 300 

Редактировать

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

+0

Может быть, я не понимаю, но стандартный вывод/STDERR не следует учитывать здесь. Я просто хочу передать некоторые данные в подпроцесс. – espais

+0

@Lattyware Я думаю, что вы можете ввести в заблуждение «многопроцессорство» с 'subprocess'? –

+0

Я пытался следовать примеру [Пример трубы] (https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes) – espais

ответ

3

Это потому, что ваш работник ждет на timestep < total_timesteps, где total_timesteps = 300 но timestep = 299 (потому что timestep в xrange(300), который 0..299).

Лучшим примером здесь является отправка какого-либо контрольного значения при обработке. Например, изменение работника:

while True: 
    data = con.recv() 
    if data == "DONE": 
     break 

Тогда на производителя:

parent_conn.send("DONE") 
p.join() 
+0

Мне кажется, что я должен удалить этот вопрос, потому что. ... вы совершенно правы. Ха ... хороший улов. – espais

+0

@espais Определенно не удаляйте - у других может быть одна и та же проблема, и это поможет им. Кроме того, вы бы отказали Дэвиду в его самых важных интернет-пунктах для его ловли;) –

+0

Хорошо, тогда поймайте ублюдка. – espais

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