Я прежде всего программист ПЛК, которому было поручено написать некоторый код для запуска на Raspberry Pi2B (Raspbian Wheezy), чтобы захватить некоторые данные из другого процесса, запущенного на RPi, и сделать эти данные доступными на Modbus TCP (старый PLC-протокол). У меня есть работа, но теперь я пытаюсь ее устранить. Я выбрал Named Pipes для IPC, и в этом мой вопрос. В моем примере кода Python (v2.7), если я запустил свой читатель, он открывается и переходит к команде readline и блокируется, как ожидалось. Когда я иду и запускаю своего писателя и выбираю открывать, писать и закрывать трубу, он делает так, как ожидалось, и записывает запись в трубу. Читатель, однако, просто сидит там, блокируя команду readline. Когда автор зацикливается и спрашивает, нужно ли открывать трубу или нет, если я выберу «y», мой читатель выплюнет запись, записанную в предыдущем цикле. Я рад, что получил свои данные, но не понимаю, почему «открытие» трубы в писателе заставляет читателя захватывать данные в это время. Я бы подумал, что увижу прочитанные данные после того, как мой писатель написал запись. Кроме того, я думаю, что «закрытие» канала в коде Writer ничего не делает, потому что я могу открыть канал в первый раз через логику, записать запись, а затем на следующем проходе через логику я могу выбрать не чтобы открыть трубку и все еще успешно записать ее.Python Named Pipes Behavior
- Что мне здесь не хватает? (риторический, вид)
- Каков правильный способ записи в именованную трубу в цикле?
- Почему читатель берет запись только после того, как Writer «открывает» трубу (независимо от того, был ли он открытым или нет с предыдущего прохода через петлю)?
Заранее благодарим за меня и будьте добры ко мне ... Помните, что я просто старый программист ПЛК, который был вынужден в Python-World!
Автор:
#!/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
Читатель:
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s %(message)s') #,filename='DocTestLog')
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.debug('Logging has started')
log.debug('Modbus Server started.')
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')
log.debug('Open pipe for reading')
PipeIn = open(PipeName, 'r')
log.debug('Pipe is open for reading')
while True:
#raw_input('Press any key to read pipe')
log.debug('Reading Line')
try:
PipeString = PipeIn.readline() [:-1]
except:
print 'Nothing there'
#PipeString = PipeIn.read()
log.debug('PipeString = '+PipeString)