#!/usr/bin/env python
import sys
import json
import gearman
from fabric import *
from fabric.api import *
from gearman import GearmanWorker
#
# Run the ssh task
#
def exe_job(worker, job):
d = json.loads(job.data)
env.host_string = d['host']
cmd = d['command']
retries = int(d['retries'])
output = ""
# Run the fabric command. Do not abort on exit
# Run job for the given number of retries
tmp_retries = retries;
while retries > 0:
with settings(warn_only=True):
result = run(cmd)
output = output + str(result)
if result.failed:
if retries == 1:
job.send_fail()
break
else:
next
else:
break
retries = retries - 1
return output
#
# Main function
#
def main():
gm_worker = gearman.GearmanWorker(['localhost:4730'])
gm_worker.register_task('exe_job',exe_job)
gm_worker.work()
if __name__ == '__main__':
main()
在我的代码中,我试图重试一个gearman作业(运行一个结构命令)来查看用户指定的重试次数。每次尝试,我都在捕捉并附加输出。在最后一次重试中,如果作业失败,我想将输出返回给客户端。
正在发生的是job.send_fail()命令只是突然发出,并且根本没有转到“return output”命令来返回失败命令的输出。
是否有更好的方法可以使作业失败并在退出/失败时将数据返回给客户端,而工作人员不会死亡?
答案 0 :(得分:3)
在Gearman中,send_fail()函数不带任何参数,只是告诉作业服务器此工作器上的这个作业失败,因此服务器可以重试或其他。
如果您同步执行程序,更好的方法是在客户端执行“重试与否”。
如果您异步执行过程,我认为您可以使用“sendException”函数。(在我的计算机中安装的python的gearman模块中,它是send_job_exception()。)此函数可以为您的客户端信息获取异常数据参数。
最后,你可以这么简单地做到这一点:(但你的齿轮手客户会收到一个“ GEARMAN_SUCCESS ”返回代码!)
#some codes
while retries > 0:
with settings(warn_only=True):
result = run(cmd)
output = output + str(result)
if result.failed:
if retries == 1:
#job.send_fail()
output = "FAILED_JOB" + "some_return_str"
break
else:
next
else:
break
retries = retries - 1
return output
this link也会帮助你。