私はしたいです:
- 非同期タスクを起動します(django-celeryやGeventなど)。
- タスクが終了するまで一定の時間待つ(1秒)
- それからタスクを殺さずに続けます。
私はこの関連スレッドに気づいた https://stackoverflow.com/a/13001153/226800;しかし、受け入れられた答えでは、 "g"が破壊されたタスクも破壊されますか?しばらく待ってから、タスクの作成者が既に戻った後でも、タスクをバックグラウンドで実行できるようにしたいです。
回答:
回答№1は1編集: はい、電話すれば g.kill()
によって含まれるタスク g
ASAPも(つまり最初の協調的コンテキストスイッチで)殺されます。
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()
.