把管子放在字典里

时间:2015-07-23 16:05:14

标签: python dictionary named-pipes

PMU_PIPE_MAP = {}

PIPE= 'tmp/%s.pipe' % hostname
if not os.path.exists(PIPE):
    os.mkfifo(PIPE)

PMU_PIPE_MAP[hostname] = os.open(PIPE, os.O_WRONLY)

我试图打开n管道。为了跟踪它们,我想以某种方式存储它们 - 比如在字典中 - 我认为上面的代码应该可以工作,但它在执行期间会冻结。有什么建议吗?

但这确实有效:

pipein = os.open(PIPE, os.O_WRONLY)

2 个答案:

答案 0 :(得分:1)

啊哈!显然,在我们从管道返回之前,必须在另一端读取。所以我问的问题不正确,因为我没有以同样的方式测试这两个场景。所以我的问题在于理解管道是如何工作的。在这种情况下,一旦在'读'端打开管道,字典条目将成功,但在此之前将阻塞。 how to determine if pipe can be written

答案 1 :(得分:-2)

它没有经过测试,但它可以帮助你

import os, tempfile

tmpdir = tempfile.mkdtemp()

PMU_FIFO_MAP = {}

def openFIFO(pname):
    filename = os.path.join(tmpdir, '%s' % pname)
    fifo = None
    try:
        os.mkfifo(filename)
        fifo = os.open(PIPE, os.O_WRONLY)
    except OSError, e:
        print "Failed to create FIFO: %s" % e
        print e.printStackTrace()
    return fifo

def closeFIFO(fname, fifo):
    fifo.close()
    os.remove(fname)

for hostname in hostnames:
    fifo = openFIFO(hostname)
    if fifo:
        PMU_FIFO_MAP[hostname] = fifo

# do stuff with fifos

for fname, fifo in PMU_FIFO_MAP.items():
    closeFIFO(fname, fifo)
    del PMU_FIFO_MAP[hostname]

os.rmdir(tmpdir)

另见Create a temporary FIFO (named pipe) in Python?