python命名管道问题

T_M*_*Mac 10 python

我正在尝试使用命名管道在守护程序和客户端之间建立双向通信.代码在尝试打开用于输入的命名管道时挂起为什么?

class comm(threading.Thread):

def __init__(self):
    self.srvoutf = './tmp/serverout'
    self.srvinf = './tmp/serverin'
    if os.path.exists(self.srvoutf):
        self.pipein = open(self.srvoutf, 'r') 
        #-----------------------------------------------------Hangs here
    else:
        os.mkfifo(self.srvoutf)
        self.pipein = open(self.srvoutf, 'r')
        #-----------------------------------------------------or here
    if os.path.exists(self.srvinf):
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)
    else:
        os.mkfifo(self.srvinf)
        self.pipeout = os.open(self.srvinf, os.O_WRONLY)

    threading.Thread.__init__ ( self )
Run Code Online (Sandbox Code Playgroud)

Nem*_*emo 13

open()规范:

使用O_RDONLY或O_WRONLY设置打开FIFO时:

如果设置了O_NONBLOCK,则只读的open()应该无延迟地返回.如果当前没有进程打开文件进行读取,则open()仅写入将返回错误.

如果清除O_NONBLOCK,则只读的open()将阻塞调用线程,直到线程打开文件进行写入.只写的open()将阻塞调用线程,直到线程打开文件进行读取.

换句话说,当您打开命名管道进行读取时,默认情况下,open将阻塞,直到打开管道的另一侧进行写入.要解决此问题,请使用os.open()并传递os.O_NONBLOCK命名管道的读取端.