我希望:
- 启动一个异步任务(使用 django-celery 或 Gevent 之类的东西),
- 等待有限的时间让任务完成(1 秒),
- 然后继续而不终止任务。
我注意到这个相关线程https://stackoverflow.com/a/13001153/226800;但是,在接受的答案中,当“g”被破坏时,任务也会被破坏吗?我想让任务在后台运行,即使任务的创建者已经返回,等待一段时间后。
编辑:是的,如果您调用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()
。