Решение Яцека Конечного хорошее и простое. Если вы хотите более гибкую передачу сообщений, рассмотрите ZeroMQ . Это дает вам много возможностей для простого создания различных решений для обмена сообщениями вокруг вашей основной программы. Используя один поток, ваша основная программа будет выглядеть примерно так:
#!/usr/bin/env python
import zmq
from time import sleep
CTX = zmq.Context()
incoming = CTX.socket(zmq.PULL)
incoming.bind("tcp://127.0.0.1:3000")
outgoing = CTX.socket(zmq.PUB)
outgoing.bind("tcp://127.0.0.1:3001")
# Poller for the incoming messages
poller = zmq.Poller()
poller.register(incoming, zmq.POLLIN)
def main():
while True:
# Do things on the network
print("[Did things on the network]")
# Send messages if you want
outgoing.send("Important message")
# Poll for incoming messages
socks = dict(poller.poll(zmq.NOBLOCK))
if incoming in socks and socks[incoming] == zmq.POLLIN:
message = incoming.recv()
# Handle message
print("[Handled message '%s']" % message)
sleep(1) # Only for this dummy program
if __name__ == "__main__":
main()
Затем вы должны написать клиента (на любом языке с привязками ZeroMQ), который отправляет и подписывается на сообщения из основной программы. Пример толкателя:
#!/usr/bin/env python
import zmq
CTX = zmq.Context()
pusher = CTX.socket(zmq.PUSH)
pusher.connect("tcp://127.0.0.1:3000")
def main():
pusher.send("Message to main program")
if __name__ == "__main__":
main()
Пример подписчика:
#!/usr/bin/env python
import zmq
CTX = zmq.Context()
subscriber = CTX.socket(zmq.SUB)
subscriber.connect("tcp://127.0.0.1:3001")
subscriber.setsockopt(zmq.SUBSCRIBE, "")
def main():
while True:
msg = subscriber.recv()
print("[Received message] %s" % msg)
if __name__ == "__main__":
main()
Звучит так, как будто вы захотите объединить программы подписчика и подписчика в одну. Если вы решили использовать ZeroMQ, взгляните на отличное руководство пользователя .
Конечно, вы также можете использовать ZeroMQ с несколькими потоками или процессами (только будьте осторожны, чтобы не разделять отдельные сокеты ZeroMQ между потоками).