从齿轮工发送失败作业输出的最佳方法是什么


#!/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 作业(运行 fabric 命令(以获取用户指定的重试次数。每次尝试,我都会捕获并附加输出。在最后一次重试中,如果作业失败,我想将输出返回到客户端。

正在发生的事情是 job.send_fail(( 命令只是中断,根本不会转到"返回输出"命令来返回失败命令的输出。

有没有更好的方法来使作业失败,并在退出/失败时将数据返回到客户端,而不会使工作线程死亡?

在 Gearman 中,send_fail(( 函数不带任何参数,只需告诉作业服务器此工作线程上的此作业失败,因此服务器可以重试或其他操作。

如果同步执行过程,更好的方法应该是在客户端执行"重试与否"工作。

如果您异步执行程序,我认为您可以使用"发送异常"功能。(在我的电脑中安装的 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

此链接也将对您有所帮助。

相关内容

  • 没有找到相关文章

最新更新