編集:はい、 を呼び出すとg.kill()
、 によって「含まれる」タスクg
もできるだけ早く強制終了されます (つまり、最初の協調コンテキスト スイッチで) ...そして、考えてみれば、それがポイントのようなものです。
Gevent では、次のようにします。
import gevent
def task():
for _ in range(10):
print "processing"
gevent.sleep(1.0)
return 'result'
task_g = gevent.spawn(task)
res = task_g.join(timeout=3.0)
if res is None:
print "task timed out but is continuing"
else:
print "got result: ", res
代わりに例外ベースのフローを好む場合は、with_timeout
;を使用できます。これには、タスクから戻ることができNone
、タイムアウトと混同しないという利点もあります。
import gevent
from gevent.timeout import Timeout, with_timeout
def task():
...
task_g = gevent.spawn(task)
try:
result = with_timeout(3.0, task_g.join)
except Timeout:
print "timeout"
result = None
else:
print "got result:", result
後で「完全に」タイムアウトした場合でも、タスクを強制終了できますtask_g.kill()
。