Как отладить странную многопоточную открытую проблему fifo? - PullRequest
0 голосов
/ 20 марта 2009

Веб-сервис настроен на предоставление некоторых своих данных при получении сигнала USR1. Сигнал будет отправлен сервером xinetd, когда он получит запрос от удаленного клиента, например, nc myserver 50666. Когда веб-сервер получает сигнал USR1, он открывает выделенный канал fifo, записывает свои данные в канал и затем закрывает канал. Тем временем сервер xinetd читает канал и передает его удаленному клиенту.

В большинстве случаев они работают хорошо, но иногда, по какой-то причине, клиент получает двойные записи. Судя по журналу, канал не закрылся должным образом, а кеш остался прежним, поэтому при следующем обслуживании клиент отправляет как предыдущий, так и текущий. Проблема в том, что это не происходит постоянно при попытке воспроизвести, к сожалению, я не смог воспроизвести один раз.

Ниже приведены простые фрагменты, демонстрирующие процесс:

Веб-сервер: (webserver.py)

def SendStream(data, pipe):
  try:
    for i in data:
      pipe.write(i + '\n') 
      pipe.flush()
  finally:
      pipe.close()

def Serve():
  threading.Thread(target=SendStream, args=(data, pipe)).start()

Сервер xinetd.d: (spitter.py)

def Serve():
  if not os.path.exists(PIPE_FILE):
    os.mkfifo(PIPE_FILE)
  os.kill(server_pid, signal.SIGUSR1)
  for i in open(PIPE_FILE):
    print i,

Так что именно случилось с дуплом? Как это вызвать? В текущем исправлении я отсоединяю файл канала и каждый раз воссоздаю его, чтобы избежать остатков, но не знаю, является ли это правильным решением.

Ответы [ 3 ]

0 голосов
/ 31 марта 2009

Здесь недостаточно отладки. Вы не показываете, как сервер обрабатывает сигналы, или открывает канал.

Если это вообще возможно, я бы рекомендовал не использовать сигналы. Они достаточно волосатые в Си, не говоря уже о собственных особенностях питона, добавленных сверху.

0 голосов
/ 14 мая 2009

Итак, настоящая проблема в том, что существует несколько клиентов. Сервер был запрошен / злоупотреблен от других неизвестных клиентов, которые изначально не были согласованы с клиентами и уверены, что он сломается в соответствии с текущим дизайном. Для решения проблемы было развернуто исправление. Так что подозрения Энди верны. Спасибо, парни!

0 голосов
/ 20 марта 2009

Если вы получите две копии файла splitter.py, работающие одновременно, возникнут проблемы, и почти все, что с вами случится, будет законным. Попробуйте добавить значение идентификатора процесса в webserver.py, например:

pipe.write (str (os.getpid ()) + i + '\ n')

Это может быть освещением.

...