Eventlet timeout not exiting

1k views Asked by At

Why does eventlet allow it to finish the 6 seconds, when it should exit the indentation after 5 seconds?

>>> with eventlet.Timeout(5):
        time.sleep(6)
        x = 1
>>> x
1
1

There are 1 answers

0
temoto On BEST ANSWER

Eventlet provides cooperative multithreading. Which means you need to yield control to give hub or coroutines (in this case, hub implements timeouts) chance to run. To yield control:

  • either use green versions of IO and sleep
  • or execute eventlet.monkey_patch(), now you can use regular time, socket, etc modules, replaced by "green" versions, cooperating with Eventlet.

Any CPU tight code without green calls, for example [_ for _ in xrange(1000000000)] is impossible to interrupt at all. If you find yourself in similar situation, place eventlet.sleep(0) somewhere in loop, that would enter Eventlet hub and allow timeouts to work.