2017-04-12 150 views
0

我試圖建立一個程序來發送一個字符串來處理Tangki和Tangki2然後發送一些數組數據每個來處理Outdata,但它似乎不能正常工作。但是當我禁用Outdata的門時,一切都完美無瑕。Python多處理管道掛

這是示例代碼:

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() 

在精確計數達到108中的過程掛起,不響應任何。當我TOP它,python3進程已經走了,似乎selang1和selang2導致的問題。我在谷歌搜索,它可能是一個管道死鎖。所以問題是如何防止這種情況發生,因爲我已經通過在input1和input2中反覆讀取管道中的所有數據。

編輯:看來,唯一的問題是tangki和tangki2之間的通信outdata

回答

0

它實際上是因爲緩衝區的大小限制?但加入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]