Я пытаюсь что-то придумать для одного из своих проектов, но застрял на одном вопросе:
Я использую операцию FIFO для отправки «сигнала» (простой T/F) от одного модуля к другому. Один модуль открывает FIFO для записи в него, а другой открывает FIFO для чтения из него. Цель здесь состоит в том, чтобы модуль чтения немедленно читал и отображал, как только модуль записи получает команду сделать это. Модуль записи открывает FIFO, но модуль чтения этого не делает.
Возможно ли то, что я пытаюсь сделать? Я пытаюсь запустить обе операции в _threads, чтобы поддерживать несколько процессов в каждом модуле. Обратите внимание, что оба модуля находятся в классах, которые я не включил для краткости (объясняя «я»).
оригинальный модуль отправки
def pipe_relay(self):
FIFO = 'pipe_relay'
thread_num = num
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
while self.relay_switch:
print("Opening FIFO...")
with open(FIFO) as fifo:
print("FIFO opened")
while self.relay_switch:
data = fifo.write(signal)
if len(data) == 0:
print("Writer is closed")
break
print('Write: "{0}"'.format(data))
обновлен модуль отправки
Я понял, что не хочу постоянно записывать в FIFO данные, которые я туда забрасывал, поэтому я удалил оператор while(). Теперь кажется, что FIFO вообще не откроется...
def pipe_relay(self, num, signal):
FIFO = 'pipe_relay'
thread_num = num
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
print("Opening FIFO...")
# does not proceed past this point
with open(FIFO, mode = 'w') as fifo:
print("FIFO opened")
data = fifo.write(signal)
if len(data) == 0:
print("Writer is closed")
print('Write: "{0}"'.format(data))
fifo.close()
приемный модуль
def pipe_receive(self):
FIFO = 'pipe_relay'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
# module proceeds to here, but no further
with open(FIFO) as fifo:
print("FIFO opened (receiver)")
while True:
data = fifo.read()
if len(data) == 0:
print("Writer is closed")
break
print('Read signal: "{0}"'.format(data))
self.DISPLAY['text'] = data
print("this is in 'pipe_receieve'")
РЕДАКТИРОВАТЬ
Запуск Убунту 17.04. Проект написан для интерпретатора Python 3.5.
fifo.flush()
после записи. см. stackoverflow.com/questions/7048095/ - person Rolf of Saxony   schedule 12.09.2017