参考:
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会如何处理呢?