2016-10-18 9 views
1

イベントを受け取る(つまりソケットを使用する)何らかの種類のサーバーが必要です。イベントごとに異なるID(つまりdstポート番号)があります。Python:複数の連続したタイムアウトを設定する

特定のIDの最初のパケットが表示されている瞬間から、何らかのタイムアウト(つまり1ms)を開始し、同じIDの他に何もイベントが受信されない場合トリガされますが、何かが受信された場合、タイムアウトは1msにリセットされます。

これは、signalsSIGALARM信号を使用することで実現できます。しかし、私は異なるIDごとに複数の「タイマー」を保持したい。

+0

[Pythonの:同時に複数のタイマーを実行する]の可能複製(http://stackoverflow.com/questions/26446110/python-running-multiple-timers-simultaneously) –

+0

何私が望む答えは異なります。答えでは、 'threading.Timer'を使ってX時間後に関数を実行する方法の例しか示していません。たとえば、1ms後に1つのイベントが表示されないようになるまで、いくつかのイベントを聞きたいのですが、まだ到着していて「期限切れになっていない」他のイベントを聞いています – edgarstack

答えて

2

selectの求人と思われます。ソケットを使用しているときは、クライアント用のソケット記述子を持っています(おそらく、クライアントごとに1つですが、持っている限り動作します)。パケットがあなたのソケットの1つに到着するまで、またはタイムアウトが発生するまで待ちます。これはまさにselectの機能です。

あなたがメッセージを受信したときにように、すべてのソケット記述子で(そして、あなたのメインループでは、単に最も早いツー期限切れとタイムアウトを計算し、select.selecttimeoutパラメータとしてこれを提供し、各クライアントの有効期限を計算します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 
+0

私はそれがうまくいくはずだと思うが、間にあまりにも多くの操作がある場合、おそらく私は問題を抱えているだろうか?タイムアウトは非常に小さいので – edgarstack

1

schedスケジューラを持つ内蔵モジュールを参照してください。

新しいスケジューラインスタンスを作成してから、scheduler.enterを使用して遅延の後に関数を呼び出すようにスケジュールできます。制限時間内にメッセージを受け取った場合は、scheduler.cancel(event)を使用してそのイベントをキューから削除することができます。 scheduler.run()を使用して別のスレッドでスケジューラを実行するか、タイムアウトのある選択多重化スレッドでscheduler.run(blocking=False)を使用できます。

+0

実行中にイベントをスケジューラに入力できますか?イベントを受け取るたびにキャンセルして再度入力する必要があるためです。私が10ミリ秒で同じ時間のイベント1000回(つまり、毎回新しいタイマーをキャンセルして入力する必要がある)を受け取った場合、これはうまくいくのでしょうか?理論的には、同じタイプのすべてのイベントが一緒に来ますが、それらをすべて受信したと考えるべきかどうかはわかりませんので、一定期間受信しないと監視する必要があります。 – edgarstack

関連する問題