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

参考:

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

 

posted @ 2017-07-28 19:04  匡子语  阅读(597)  评论(0编辑  收藏  举报