1

私はしたいです:

  1. 非同期タスクを起動します (django-celery や Gevent などを使用)。
  2. タスクが完了するまで有限時間 (1 秒) 待機し、
  3. タスクを強制終了せずに続行します。

この関連スレッドに気付きましたhttps://stackoverflow.com/a/13001153/226800 ; ただし、受け入れられた回答では、「g」が破棄されると、タスクも破棄されますか? しばらく待ってから、タスクの作成者がすでに戻ってきた後でも、タスクをバックグラウンドで実行できるようにしたい。

4

1 に答える 1

1

編集:はい、 を呼び出すと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()

于 2013-10-02T16:02:14.810 に答える