4

Pythonでタイムアウトを本当に実装するには? http://eventlet.net/doc/modules/timeout.html

コードは次のようになります。

#!/usr/bin/python
import eventlet
import time
import sys
import random

while True:
        try:
         with eventlet.timeout.Timeout(1, False):
                print 'limited by timeout execution'
                while True:
                        print '\r' + str(random.random()),
                        sys.stdout.flush()
                        eventlet.sleep(0)
                print ' Never printed Secret! '
        except Exception as e:
                print ' Exception: ', e
        finally:
                print ''
                print ' Timeout reached '
                print ''

タイムアウトになることはありません。どこが間違っていますか?

私が置き換えた追伸:

 time.sleep(0.1)

と:

 eventlet.sleep(0)

例外に False を追加すると、うまく機能するようになりました。

with eventlet.timeout.Timeout(1):

への変更:

with eventlet.timeout.Timeout(1, False):

ただし、eventlet.sleep(0.1) でのみ機能します

たとえば、このコードは間違っています:

#!/usr/bin/python
import eventlet
import time
start_time = time.time()
data = 0
with eventlet.timeout.Timeout(1, False):
        while True:
                data +=1
print 'Catch data ', data, ' in ', time.time() - start_time

sleep 0 秒を追加するだけです。

eventlet.sleep(0)

そして、それは魅力のように機能します。

解決済み

4

1 に答える 1

5

eventlet の Timeout は、期待したほど魔法ではありません。「グリーンスレッド」コード (イベントレットの協調マルチスレッド システムを使用するコード) でのみタイムアウトを検出できます。Timeout docsに記載されているように、「このクラスでは CPU のみの操作をタイムアウトにすることはできません」。 time.sleepeventlet の greenthreads ではなく、Python の内部スレッド システムで一時停止します。

代わりに、greenthreadsで正しく動作する eventlet.sleep を使用してください。

于 2013-07-08T20:55:45.547 に答える