gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:28 25 4
gpt4 key购买 nike

#!/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() 函数没有参数,只是告诉作业服务器这个 worker 上的这个作业失败了,所以服务器可以做重试或其他事情。

如果您同步执行程序,更好的方法应该是在客户端执行“是否重试”工作。

如果您异步执行程序,我认为您可以使用“sendException”函数。(在我的计算机中安装的 python 的 gearman 模块中,它是 send_job_exception()。)此函数可以为您的客户端信息获取异常数据参数。

最后,您可以像这样简单地做:(但是您的 gearman 客户端将收到“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 worker 发送失败的作业输出的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com