我希望:
我注意到了这个相关的帖子https://stackoverflow.com/a/13001153/226800;然而,在接受的答案中,当'g'被破坏时,任务是否也会被破坏?我想在等待一段时间之后,即使在任务的创建者已经返回之后,也允许任务在后台运行。
答案 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()
“完全”超时,你仍然可以杀死该任务。