我主要是一名PLC程序员,他的任务是编写一些代码在Raspberry Pi2B(Raspbian Wheezy)上运行,以便从RPi上运行的另一个进程中获取一些数据,并在Modbus TCP上提供这些数据(旧 PLC协议)接口。我有它的工作,但我现在正试图防止它。我为IPC选择了命名管道,这就是我的问题。在我的Python(v2.7)示例代码中,如果我启动我的阅读器,它会打开并转到readline命令并按预期阻塞。当我启动我的编写器并选择打开,写入和关闭管道时,它会按预期执行并将记录写入管道。然而,读者只是坐在那里阻塞readline命令。当作者循环回来并询问是否打开管道时,如果我选择“y”,我的读者会吐出在前一循环中写入的记录。我很高兴我得到了我的数据,但不明白为什么“打开”编写器中的管道导致读者在那时抓取数据。在我的作家写完记录之后,我会认为我会看到读数据。另外,我认为“关闭”Writer代码中的管道没有做任何事情,因为我可以在第一次通过逻辑打开管道,写一条记录,然后在下一次通过逻辑我可以选择不打开管道并仍然成功写入。
提前感谢并对我好...请记住,我只是一个被迫进入Python-World的旧PLC程序员!
编剧:
TreeMap<Integer, TreeSet>
阅读器:
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s %(message)s')
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.debug('Logging has started')
log.debug('DocTest Pipe Writer')
import os, time, sys
PipeName = 'DocTestPipe'
if not os.path.exists(PipeName):
log.debug('Pipe not present...Creating...')
os.mkfifo(PipeName, 0777)
log.debug('Pipe is made')
else:
log.debug('Pipe already present')
ModbusSeed = 0
while True:
OpenPipe = raw_input ('Open pipe? y or n')
if OpenPipe == 'y':
log.debug('Opening pipe')
PipeOut = open(PipeName, 'w')
log.debug('Pipe is open for writing.')
else:
log.debug('Chose not to open pipe')
DataPipeString = '%05d' % ModbusSeed+','+'%05d' % (ModbusSeed+1)+','+'%05d' % (ModbusSeed+2)+','+ \
'%05d' % (ModbusSeed+3)+','+'%05d' % (ModbusSeed+4)+','+'%05d' % (ModbusSeed+5)+','+ \
'%05d' % (ModbusSeed+6)+','+'%05d' % (ModbusSeed+7)+','+'%05d' % (ModbusSeed+8)+','+ \
'%05d' % (ModbusSeed+9)+'\n'
print 'Pipe Data to write: '+DataPipeString
WritePipe=raw_input('Write Pipe? y or n')
if WritePipe == 'y':
log.debug('Writing pipe')
PipeOut.write(DataPipeString)
log.debug('Pipe is written.')
ClosePipe = raw_input('Close pipe? y or n')
if ClosePipe == 'y':
log.debug('Closing pipe')
PipeOut.close
log.debug('Pipe is closed')
else:
log.debug('Pipe left open')
ModbusSeed=ModbusSeed+1
答案 0 :(得分:1)
经过多次搔痒,搜索互联网,以及反复试验,我得到了答案。问题的症结在于,当我打开管道写作时,我没有指定“缓冲”参数。这导致我的管道写入被缓存在缓冲区中的某处,而不是立即写入管道。每当我“打开”我的写管道时,它就会将缓冲区冲到管道上,然后我的读取器将其拾起。解决方案是在我的“open”命令中添加“,0”作为附加参数(PipeOut = open(PipeName,'w',0)而不是PipeOut = open(PipeName,'w')),从而设置缓冲区大小为零。现在,当我“写”到管道时,数据直接进入管道,并且在刷新之前不会处于不稳定状态。