【问题标题】:What is the best way to send failed job output from gearman worker?从 gearman worker 发送失败的作业输出的最佳方法是什么?
【发布时间】:2012-01-25 15:04:33
【问题描述】:
#!/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() 命令只是简单地中断,根本没有转到“返回输出”命令来返回失败命令的输出。

有没有更好的方法让作业失败,并且在退出/失败时将数据返回给客户端,而不会导致工作人员死亡?

【问题讨论】:

    标签: python gearman


    【解决方案1】:

    在 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 也会帮助你。

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2011-12-01
      • 2011-06-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多