2017-04-12 1 views
0

Tangki와 Tangki2를 처리하기 위해 문자열을 보내고 각각 Outdata를 처리하기 위해 배열 데이터를 조금씩 보내도록 프로그램을 작성하려하지만 올바르게 작동하지 않는 것 같습니다. 그러나 나가 Outdata에 문을 무능하게 할 때 모두는 완벽하게 작동한다. 전혀 응답하지 않는 프로세스가 응답 (108)에 도달Python Multiprocessing Pipe hang

import os 
from multiprocessing import Process, Pipe 
from time import sleep 
import cv2 


def outdata(input1,input2): 
    while(1): 
     room=input1.recv() 
     room2=input2.recv() 


def tangki(keran1,selang1):        ##============tangki1 
    a=None 
    x,y,degree,tinggi=0,0,0,0 
    dout=[] 
    while(1): 
     frame=keran1.recv() 
     dout.append([x,y,degree,tinggi]) 
     selang1.send(dout) 
     print ("received from: {}".format(frame)) 


def tangki2(keran3,selang2):      ##=================tangki2 
    x,y,degree,tinggi=0,0,0,0 
    dout2=[] 
    while(1): 
     frame=keran3.recv() 
     dout2.append([x,y,degree,tinggi]) 
     selang2.send(dout2) 
     print("received from: {}".format(frame)) 

def pompa(gate1,gate2): 

    count=0 
    while(1): 
     count+=1 
     gate1.send("gate 1, val{}".format(count)) 
     gate2.send("gate 2, val{}".format(count)) 




if __name__ == '__main__': 

    pipa1, pipa2 = Pipe() 
    pipa3, pipa4 = Pipe() 
    tx1,rx1 = Pipe() 
    tx2,rx2 = Pipe() 

    ptangki = Process(target=tangki, args=(pipa2, tx1)) 
    ptangki2 = Process (target=tangki2, args=(pipa4, tx2)) 
    ppompa = Process(target=pompa, args=(pipa1,pipa3)) 
    keran = Process(target=outdata, args=(rx1,rx2)) 

    ptangki.start() 
    ptangki2.start() 
    ppompa.start() 
    keran.start() 

    ptangki.join() 
    ptangki2.join() 
    ppompa.join() 
    keran.join() 

정확한 카운트에서 :

은 예제 코드입니다. 내가 TOP, python3 프로세스가 사라 졌을 때 selang1과 selang2가 문제를 일으키는 것 같습니다. Google에서 검색했는데 파이프 교착 상태 일 수 있습니다. 그래서 질문은 input1과 input2 모두에서 반복적으로 읽음으로써 파이프의 모든 데이터를 이미 덤프했기 때문에 발생하지 않도록하는 방법입니다.

편집 :는 유일한 문제는 tangki와 tangki2 간의 통신이 실제로 때문에 버퍼 크기 제한의

답변

0

을 outdata했다 것 같다? 그러나 dout=[x,y,degree,tinggi]dout=[x,y,degree,tinggi] 및 추가하는 것은, 또는 직후 selang1.send(dout)selang2.send(dout2)

dout=[0,0,0,0]dout2=[0,0,0,0] 할당함으로써 최소한의 데이터의 크기를 재설정