编程语言
首页 > 编程语言> > python – 从gearman worker发送失败的作业输出的最佳方法是什么?

python – 从gearman worker发送失败的作业输出的最佳方法是什么?

作者:互联网

#!/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”命令来返回失败命令的输出.

有没有更好的方法来失败一个工作,并在退出/失败时将数据返回给客户端而工人没有死亡?

解决方法:

在Gearman中,send_fail()函数不带任何参数,只告诉作业服务器此worker上的这个作业失败,因此服务器可以重试或其他.

如果您同步执行您的过程,更好的方法是在客户端执行“重试或不重试”.

如果你异步执行你的程序,我认为你可以使用“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也会帮助你.

标签:python,gearman
来源: https://codeday.me/bug/20190630/1335404.html