/ / callしてPythonで非同期イベントを待つ(しばらく) - python、django、celery、gevent、gunicorn

Pythonでの非同期イベントの呼び出しと待機(しばらくの間) - python、django、celery、gevent、gunicorn

私はしたいです:

  1. 非同期タスクを起動します(django-celeryやGeventなど)。
  2. タスクが終了するまで一定の時間待つ(1秒)
  3. それからタスクを殺さずに続けます。

私はこの関連スレッドに気づいた 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().