Gevent Verständnisfragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Mittwoch 20. November 2013, 12:29

Hallo,

ich habe ein paar Probleme gevent richtig zu verstehen:

Zur Ausgangslage:

Ein udp Server der Aufträge entgegennimmt und greenlets startet:

Code: Alles auswählen

def UPDServer():
   .....       
            data,addr = UDPSock.recvfrom(1024)
            gevent.spawn(prepareWork, data)                
   .....   


Dann folgt in prepareWork:

Code: Alles auswählen

...
for d in data.split():
        gevent.spawn(startWork, d)
...
Dann in startWork:

Code: Alles auswählen

....
        worker = gevent.spawn(longRunningFunction, d)
        worker.join()
....

Ich würde gerne die longRunningFunction mit einem Timeout versehen. Da gibt es bei gevent verschiedene Ansätze

Code: Alles auswählen

import gevent
from gevent import Timeout

def wait():
    gevent.sleep(2)

timer = Timeout(1).start()
thread1 = gevent.spawn(wait)

try:
    thread1.join(timeout=timer)
except Timeout:
    print('Thread 1 timed out')

# --

timer = Timeout.start_new(1)
thread2 = gevent.spawn(wait)

try:
    thread2.get(timeout=timer)
except Timeout:
    print('Thread 2 timed out')

# --

try:
    gevent.with_timeout(1, wait)
except Timeout:
    print('Thread 3 timed out')
Was sind da genau die Unterschiede und wenn ich startWork mehrmals hintereinander aufrufe, bevor die longRunningFunction von einem vorherigen greenlet beendet wurde, wird dann worker jedesmal überschrieben und ein evtl timeout weitergeführt obwohl er sich eigtl resetten sollte?

Zum Schluss noch ein Beispiel was ich nicht verstehe:

Code: Alles auswählen

def timer():
    time.sleep(12)
    return "ok"


def main():
    result = False
    with gevent.Timeout(5, False):
        timer()
        result = True
        print result
    if result == False:
        print "Timer failed"
        
main()
Warum ist die Ausgabe True und nicht Timer failed
Antworten