select
の求人と思われます。ソケットを使用しているときは、クライアント用のソケット記述子を持っています(おそらく、クライアントごとに1つですが、持っている限り動作します)。パケットがあなたのソケットの1つに到着するまで、またはタイムアウトが発生するまで待ちます。これはまさにselect
の機能です。
あなたがメッセージを受信したときにように、すべてのソケット記述子で(そして、あなたのメインループでは、単に最も早いツー期限切れとタイムアウトを計算し、select.select
にtimeout
パラメータとしてこれを提供し、各クライアントの有効期限を計算しますrlist
パラメータ)。その後、新しいパケット/メッセージが到着したとき、または最も古いタイムアウトが切れるとき、あなたは目を覚ます。新しいパケットの場合は、パケットを処理して、そのプロバイダのタイムアウトを1msにリセットします。それ以外の場合は、タイムアウトの期限が切れたときに行う操作を実行します。
次に、期限切れのタイムアウトを計算します。リンス。泡。繰り返す。
このような何か:
now = time.time()
timeout = min([(client.expiration - now) for client in clients_list])
rrdy, wrdy, xrdy = select.select([client.sock for client in clients_list], [], [], timeout)
if not rrdy:
# Timeout
now = time.time()
for client in clients_list:
if client.expiration < now:
process_timeout(client)
else:
# Process incoming messages
for rsock in rrdy:
process_message(rsock.recv(4096))
client.expiration = time.time() + .001
[Pythonの:同時に複数のタイマーを実行する]の可能複製(http://stackoverflow.com/questions/26446110/python-running-multiple-timers-simultaneously) –
何私が望む答えは異なります。答えでは、 'threading.Timer'を使ってX時間後に関数を実行する方法の例しか示していません。たとえば、1ms後に1つのイベントが表示されないようになるまで、いくつかのイベントを聞きたいのですが、まだ到着していて「期限切れになっていない」他のイベントを聞いています – edgarstack