Jacek Koniecznyの解決策は良いと簡単です。より柔軟なメッセージの受け渡しを希望する場合は、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を使用する場合は、the excellent user guideをご覧ください。
もちろん、複数のスレッドまたはプロセスなしでZeroMQを使用することもできます(スレッド間で個々のZeroMQソケットを共有しないように注意してください)。
出典
2011-07-11 08:40:23
cwb
私は必要に応じてコードを共有することができますが、これはまさに私が必要としているものと思われます。基本的には、TCPConnection経由でサーバに接続し、着実にデータを送受信するボットです。私がしようとしていることは、すべてが実行されている間に、関数の1つを呼び出して、その関数にプログラムをインターラップすることなくデータを送信できることです。たとえば、ボットには、サーバからの送信に応答して送信するデータがハードコードされている場合がありますが、ゲームのチャットにメッセージなどのカスタムを送信できるようにしたい場合は、 – WeaponsTheyFear
また、単一スレッドの非同期イベントループを使用して、これらの種類のIOバウンド多重化をより簡単に行うこともできます。 Twistedフレームワークのようなものを使うことができます。すでにこの組み込み関数をサポートしているかもしれません。 – Keith