您的位置:首页 > 编程语言 > Python开发

【python】gearman阻塞非阻塞,同步/异步,状态

2017-07-28 19:04 387 查看
参考:

http://pythonhosted.org/gearman/client.html?highlight=submit_multiple_jobs#gearman.client.GearmanClient.submit_multiple_jobs

http://blog.csdn.net/y2701310012/article/details/44035959

github上一个使用GearmanAdminClient获取gearman任务状态的例子:

https://github.com/zolech/zabbix-gearman-template/blob/master/check_gearman.py

在使用gearman分发任务时,如果分发速度过快容易导致队列满载,进而导致后续任务丢失等问题。所以需要根据任务队列大小适当放缓发送任务的速度。

下面给出了代码例子:

def sharp_task_request(list_of_jobs):
global gearman_host, gearman_port, task_name, task_queue_max
ret = 0
try:
gm_client = GearmanClient([gearman_host + ":" + gearman_port])
gm_admin_client = GearmanAdminClient([gearman_host + ":" + gearman_port])
# background=False client同步  wait_until_complete=False 非阻塞模式
submitted_requests = gm_client.submit_multiple_jobs(list_of_jobs, background=False, wait_until_complete=False)
while True:
gm_status = gm_admin_client.get_status()
for task in gm_status:
if task['task'] == task_name:
if task['queued'] >= task_queue_max:  # 任务队列过大时等待
time.sleep(2)
else:
break
except:
traceback.print_exc()
ret = 1
return ret


background:表示同步(False)或者异步(True) 同步的含义是:client在给server提交任务后关注任务的结果,即会从server获取任务执行结果。 而异步则表示:client不关心server中任务的执行结果,没有结果返回通道。

wait_until_complete:表示阻塞(True)或者非阻塞(False) 阻塞的含义是:client一直等到server的返回结果后才继续向下运行。 而非阻塞的含义是:client发布任务给server后立刻向下执行,可以后续再获取执行结果。

上面的代码只避免了队列拥挤,但是如果任务失败了gearman会如何处理呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: