現在、クライアントとして機能する python クラスをプログラミングしています。メインスレッドをブロックしたくないので、パケットの受信は別のスレッドで行い、パケットが到着したらコールバック関数を呼び出します。
受信したパケットは、ブロードキャスト メッセージか、クライアントから送信されたコマンドに対する応答のいずれかです。コマンドを送信する関数は同期的で、応答が到着するまでブロックされるため、結果を直接返すことができます。
簡単な例:
import socket
import threading
class SocketThread(threading.Thread):
packet_received_callback = None
_reply = None
_reply_event = threading.Event()
def run(self):
self._initialize_socket()
while True:
# This function blocks until a packet arrives
p = self._receive_packet()
if self._is_reply(p):
self._reply = p
self._reply_event.set()
else:
self.packet_received_callback(p)
def send_command(self, command):
# Send command via socket
self.sock.send(command)
# Wait for reply
self._reply_event.wait()
self._reply_event.clear()
return self._process_reply(self._reply)
私が今直面している問題は、デッドロックで終了するため、コールバック関数でコマンドを送信できないことです (send_command は応答を待機しますが、パケットを受信するスレッドが実際にコールバックを実行しているため、パケットを受信できません)。関数)。
私の現在の解決策は、コールバック関数を呼び出すたびに新しいスレッドを開始することです。しかし、この方法では多くのスレッドが生成され、トラフィックが多い状況でパケットが同期的に処理されることを保証することが難しくなります。
よりエレガントなソリューションを知っている人はいますか、それとも正しい方法で進んでいますか?
ご協力いただきありがとうございます!