Python多处理管道挂起

时间:2017-04-12 07:34:32

标签: python-3.x pipe multiprocessing

我正在尝试构建一个程序来发送一个字符串来处理Tangki和Tangki2,然后发送一些数组数据来处理Outdata,但它似乎无法正常工作。但当我禁用Outdata的门时,一切都完美无瑕。

这是示例代码:

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

1 个答案:

答案 0 :(得分:0)

它实际上是因为缓冲区大小限制?但添加dout=[x,y,degree,tinggi]dout=[x,y,degree,tinggi]会将数据大小重置为最小,或者在dout=[0,0,0,0]dout2=[0,0,0,0]之后立即分配selang1.send(dout)selang2.send(dout2)