スレッドは私の脳を溶かします。ワーカー + キープアライブ モデルを実装するさまざまな方法を見てきましたが、最適なアプローチを見つけるのは困難です。コードの簡略版は次のとおりです。
def start_thread(function):
t = Thread(target=function)
t.setDaemon(True)
t.start()
def worker:
run = True
start_thread(keepalive_fn)
msg = recv() #blocking
while msg is not None and run:
process(msg)
try:
msg = recv()
except:
if run:
reconnect()
break
else:
if run:
reconnect()
def keepalive_fn():
while run:
try:
send('hb')
except:
close_connection()
break
sleep(heartbeat)
def connect():
open_connection()
start_thread(worker)
def reconnect():
close_connection()
connect()
connect()
これは宣伝どおりに機能しますか? より良い方法はありますか?recv() がすでにこのケースを処理しているため、close_connection() が呼び出されたときに壊れた msg がないことに注意してください。