Несколько скриптов Python, отправляющих сообщения в один центральный скрипт - PullRequest
3 голосов
/ 18 мая 2010

У меня есть несколько сценариев, написанных на Python 2.6, которые можно запускать произвольно. Я хотел бы иметь один центральный скрипт, который собирает выходные данные и отображает их в одном журнале.

В идеале это удовлетворяло бы этим требованиям:

  • Каждый скрипт отправляет свои сообщения одному и тому же «получателю» для отображения.
  • Если получатель не работает, когда первый скрипт пытается отправить сообщение, он запускается.
  • Приемник также можно запустить и завершить вручную. (Хотя, если он закончится, он перезапустится, если другой скрипт попытается отправить сообщение.)
  • Скрипты могут быть запущены в любом порядке, даже одновременно.
  • Работает на Windows . Мультиплатформенность лучше, но, по крайней мере, она должна работать на Windows.

Я наткнулся на несколько подсказок:

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

Ответы [ 3 ]

5 голосов
/ 18 мая 2010

Я хотел бы рассмотреть вопрос об использовании logging.handlers.SocketHandler для передачи сообщений, похоже, у вас уже есть пример использования типа регистрации.

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

Это не относится к автоматическому перезапуску части вашего вопроса. Для UNIX вы, вероятно, просто использовали бы pid-файлы и os.kill(pid, 0), чтобы проверить, работает ли он, но я не знаю, каковы будут их эквиваленты в мире Windows.

1 голос
/ 18 мая 2010

Я построил сервер для использования именованного канала Windows, используя следующий код ключа:

    def run( self ):
        # This is the main server loop for the Win32 platform
        import win32pipe
        import win32file
        self.pipeHandle = win32pipe.CreateNamedPipe(
            '\\\\.\\pipe\\myapp_requests',
            win32pipe.PIPE_ACCESS_DUPLEX,
            win32pipe.PIPE_TYPE_BYTE |
            win32pipe.PIPE_READMODE_BYTE |
            win32pipe.PIPE_WAIT,
            1,
            4096,
            4096,
            10000,
            None)
        if self.pipeHandle == win32file.INVALID_HANDLE_VALUE:
            print 'Failed to create named pipe %s!' % self.pipeName
            print 'Exiting...'
            sys.exit(1)
        while True:
            # Open file connection
            win32pipe.ConnectNamedPipe( self.pipeHandle )

            # Run the main message loop until it exits, usually because
            # of a loss of communication on the pipe
            try:
                self.messageLoop()
            except ServerKillSignal:
                break

            # Return the pipes to their disconnected condition and try again
            try: win32pipe.DisconnectNamedPipe( self.pipeHandle )
            except: pass
        win32file.CloseHandle( self.pipeHandle )
        print "Exiting server"

Метод messageLoop() читает данные из канала, используя win32file.ReadFile(), до тех пор, пока не будет выдан win32file.error. Затем он выходит, позволяя run () перезапустить его.

В моей реализации пользователи вряд ли имели доступ администратора, поэтому его нельзя было запускать как системную службу. Вместо этого я кодировал клиента для проверки наличия канала в '\. \ Pipe \ pyccf_requests'. Если он не существует, клиент запускает новый процесс на сервере.

0 голосов
/ 25 мая 2010

Ответ Дэна Хэда - именно то, что вы хотите.

Элемент № 2, «Если получатель не работает, когда первый скрипт пытается отправить сообщение, он запущен», вероятно, не будет работать. Что-то должно быть запущено, чтобы получить сообщение. Я предлагаю написать демонический процесс, который запускается при загрузке, и сказать Windows перезапустить его, если он умрет.

...