调用并等待(一段时间)Python中的异步事件

时间:2013-10-02 15:49:41

标签: python django celery gevent gunicorn

我希望:

  1. 启动异步任务(使用django-celery或Gevent),
  2. 等待有限的时间完成任务(1秒),
  3. 然后继续而不杀死任务。
  4. 我注意到了这个相关的帖子https://stackoverflow.com/a/13001153/226800;然而,在接受的答案中,当'g'被破坏时,任务是否也会被破坏?我想在等待一段时间之后,即使在任务的创建者已经返回之后,也允许任务在后台运行。

1 个答案:

答案 0 :(得分: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()“完全”超时,你仍然可以杀死该任务。