Klingt wie ein Job für select
. Da Sie Sockets verwenden, haben Sie einen Socket-Deskriptor für einen Client (vermutlich einen für jeden Client, aber solange Sie einen haben, funktioniert es). Sie möchten also entweder warten, bis ein Paket in einem Ihrer Sockets ankommt, oder bis ein Timeout auftritt. Genau das tut select
.
berechnen also die Ablaufzeit für jeden Client, wenn Sie eine Nachricht erhalten, dann in der Hauptschleife, einfach berechnen die am ehesten verfallen Timeout und sehen vor, dass als timeout
Parameter select.select
(mit allen Socket-Deskriptoren wie die rlist
Parameter). Dann werden Sie geweckt, wenn ein neues Paket/Nachricht ankommt oder wenn das älteste Timeout abläuft. Wenn es sich um ein neues Paket handelt, verarbeiten Sie das Paket und setzen das Zeitlimit des Providers auf 1 ms zurück. Andernfalls tun Sie, was auch immer Sie tun, wenn das Zeitlimit abgelaufen ist.
Berechnen Sie anschließend das Zeitlimit für die Zeitüberschreitung. Spülen. Schaum. Wiederholen.
Etwas wie folgt aus:
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
Mögliche Duplikat [Python: Laufen mehrere Timer gleichzeitig] (http://stackoverflow.com/questions/26446110/python-running-multiple-timers-simultaneously) –
Was Ich will, ist anders, in den Antworten geben sie nur ein Beispiel dafür, wie man eine Funktion nach X-Zeit mit 'threading.Timer' ausführt. Ich möchte auf einige Ereignisse warten, bis ein Ereignis nicht nach 1 ms zum Beispiel erscheint, aber dann immer noch auf die anderen Ereignisse lausche und nicht "abgelaufen" – edgarstack