Как передать информацию демону Python?

У меня есть демон Python, работающий в системе Linux. Я хотел бы передать информацию, такую ​​как «Боб», «Алиса» и т. Д., И иметь демоновую печать «Привет Боб». и "Hello Alice" в файл.

Это должно быть асинхронным. Демон Python должен ждать информации и распечатывать его всякий раз, когда он получает что-то.

Какой был бы лучший способ достичь этого?

Я думал об именованном канале или в библиотеке Queue но могли бы быть лучшие решения.

8 Solutions collect form web for “Как передать информацию демону Python?”

Вот как вы можете это сделать с помощью fifo:

 # receiver.py import os import sys import atexit # Set up the FIFO thefifo = 'comms.fifo' os.mkfifo(thefifo) # Make sure to clean up after ourselves def cleanup(): os.remove(thefifo) atexit.register(cleanup) # Go into reading loop while True: with open(thefifo, 'r') as fifo: for line in fifo: print "Hello", line.strip() 

Вы можете использовать его так же из сеанса оболочки

 $ python receiver.py & $ echo "Alice" >> comms.fifo Hello Alice $ echo "Bob" >> comms.fifo Hello Bob 

Существует несколько вариантов

1) Если демон должен принимать сообщения из других систем, сделайте daemon сервером RPC – используйте xmlrpc / jsonrpc.

2) Если все локально, вы можете использовать либо TCP-сокеты, либо Named PIPE.

3) Если одновременно будет подключен огромный набор клиентов, вы можете использовать select.epoll.

Есть несколько механизмов, которые вы могли бы использовать, но все сводится к использованию IPC (межпроцессная коммуникация).

Теперь, фактический механизм, который вы будете использовать, зависит от деталей того, что вы можете достичь, хорошего решения, хотя было бы использовать что-то вроде zmq.

Проверьте следующий пример в pub / sub на zmq

http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/patterns/pubsub.html

также это

http://learning-0mq-with-pyzmq.readthedocs.org/en/latest/pyzmq/multisocket/zmqpoller.html

для неблокирующего способа.

python имеет встроенную библиотеку rpc (с использованием xml для кодирования данных). документация хорошо написана; там есть полный пример:

(python 2.7) или

(python 3.3)

которые, возможно, стоит рассмотреть.

Я не очень хорош в python, поэтому я хотел бы поделиться
** Универсальное взаимодействие между процессами **

nc aka netcat – это модель клиентской модели сервера, которая позволяет отправлять такие данные, как текст, файлы по сети.

Преимущества nc

  • Очень проста в использовании
  • IPC даже между различными языками программирования
  • Встроенный в большинстве ОС Linux

пример
На deamon

 nc -l 1234 > output.txt 

Из другой программы или оболочки / терминала / скрипта

 echo HELLO | nc 127.0.0.1 1234 

nc может быть python, используя функцию вызова системной команды (может быть os.system) и читать stdout.

Почему бы не использовать сигналы?

Я не программист на python, но, предположительно, вы можете зарегистрировать обработчик сигнала в своем демоне, а затем передать его с терминала. Просто используйте SIGUSR или SIGHUP или аналогичные.

Это обычный метод, используемый для вращения лог-файлов или аналогичных.

Одним из решений может быть использование библиотеки asynchat, которая упрощает вызовы между сервером и клиентом.

Вот пример, который вы могли бы использовать (адаптированный с этого сайта )

В deamon.py ChatServer объект ChatServer . Каждый раз, когда соединение выполняется, ChatHandler объект ChatHandler , унаследованный от asynchat.async_chat . Этот объект собирает данные и заполняет их в self.buffer .

Когда встречается специальная строка, вызывающая терминатор, данные должны быть полными и found_terminator метод found_terminator . Именно в этом методе вы пишете свой собственный код.

В sender.py вы создаете объект ChatClient , унаследованный от asynchat.async_chat , настраиваете соединение в конструкторе, определяете терминатор (в случае ответа сервера!) И вызываете метод push для отправки ваших данных. Вы должны добавить строку терминатора в свои данные, чтобы сервер знал, когда он может прекратить чтение данных.

daemon.py:

 import asynchat import asyncore import socket # Terminator string can be changed here TERMINATOR = '\n' class ChatHandler(asynchat.async_chat): def __init__(self, sock): asynchat.async_chat.__init__(self, sock=sock) self.set_terminator(TERMINATOR) self.buffer = [] def collect_incoming_data(self, data): self.buffer.append(data) def found_terminator(self): msg = ''.join(self.buffer) # Change here what the daemon is supposed to do when a message is retrieved print 'Hello', msg self.buffer = [] class ChatServer(asyncore.dispatcher): def __init__(self, host, port): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind((host, port)) self.listen(5) def handle_accept(self): pair = self.accept() if pair is not None: sock, addr = pair print 'Incoming connection from %s' % repr(addr) handler = ChatHandler(sock) server = ChatServer('localhost', 5050) print 'Serving on localhost:5050' asyncore.loop() 

sender.py:

 import asynchat import asyncore import socket import threading # Terminator string can be changed here TERMINATOR = '\n' class ChatClient(asynchat.async_chat): def __init__(self, host, port): asynchat.async_chat.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.connect((host, port)) self.set_terminator(TERMINATOR) self.buffer = [] def collect_incoming_data(self, data): pass def found_terminator(self): pass client = ChatClient('localhost', 5050) # Data sent from here client.push("Bob" + TERMINATOR) client.push("Alice" + TERMINATOR) 

Все упомянули FIFO-s (это назвали каналы в терминологии Linux) и XML-RPC, но если вы изучаете эти вещи прямо сейчас, вам также нужно проверить сокеты TCP / UDP / Unix, поскольку они независимы от платформы (по крайней мере, TCP / UDP). Вы можете проверить этот учебник для рабочего примера или документации на Python, если вы хотите идти дальше в этом направлении. Это также полезно, поскольку большинство современных коммуникационных платформ (XML-RPC, SOAP, REST) ​​используют эти основные вещи.

  • Есть ли способ перечислить очереди в кроличнике через pika?
  • Как правильно улавливать и обрабатывать тайм-ауты RQ в Python?
  • работник не потребляет задачи после того, как сельдерей вызывается add_consumer
  • Лучший способ получить индексированный доступ к очереди Python, потокобезопасный
  • Где я могу зарегистрировать задание rq-scheduler в приложении Django?
  • Изучение python и потоков. Я думаю, что мой код работает бесконечно. Помогите мне найти ошибки?
  • Использование многопоточной очереди в python правильно?
  • Эквивалент сельдерея: JoinableQueue
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.