3番目のスレッドを使用する代わりに、を使用threading.Lock()
してソケットリソースを保護することをお勧めします。これにより、3番目のスレッドが不要になります。3番目のスレッドがある場合よりも、オーバーヘッドとレイテンシーが低くなります。
import threading
lock = threading.Lock()
def sendfunction(sock, data):
with lock:
sock.send(data)
どちらのスレッドからでも呼び出すことができますが、一度に呼び出すことができるのは1つのスレッドだけsock.send
です。スレッドが別のスレッドによってすでにロックされているロックに到達すると、他のスレッドがロックを解放するまでスリープし、その後ロックを取得してプロセスが繰り返されます。
スレッドモジュールには、、が含まれていますLock
。RLock
これらCondition
はすべて、複数のスレッドを処理するときに非常に役立ちます。これらのスレッドとその使用法に慣れておく価値は十分にあります。
各メッセージを処理する前に、現在の時刻と最後にハートビートを送信した時刻を確認することで、ハートビートをメッセージ処理に組み込むことができます。これにより、メッセージが殺到してハートビートが送信されなくなるのを防ぐことができます。問題は、メッセージ処理コードが実行されない場合、ハートビートが送信されないことです。メッセージ処理コードに定期的にダミーメッセージを取得させて、ハートビートを送信する必要があるかどうかを確認し、ダミーメッセージを無視することで、これを軽減できます。
スレッドは慎重に使用するようにしてください(単一のスレッドを目指してください)。ただし、ほとんどの時間をスリープ状態にするため、スレッドは問題ない可能性があります。ただし、デーモンスレッドは適切にシャットダウンされないため、使用しないでください。適切にシャットダウンしなかった場合、損傷は存在しない可能性がありますが、それでも何らかの障害(エラーメッセージ)がスローされ、見栄えが悪くなる可能性があります。
実際には状況が複雑になると思うので、マルチソケット方式には同意しません。ハートビートとメッセージを単一のソケットバイトストリームに組み込む多くの種類のネットワークサービス/アプリケーションがあります。