在工作处理期间改变python-gearman工作者任务

时间:2011-03-19 14:54:53

标签: python gearman python-gearman

我正在尝试在其工作周期中更改python-gearman worker上可用的任务。我这样做的原因是允许我对我的工作进程进行一点控制,并允许它从数据库重新加载。我需要每个工人定期重新加载,但我不想简单地杀死进程,我希望服务始终可用,这意味着我必须分批重新加载。所以我会重新装载4名工人,另有4名工人可以处理,然后重新装载接下来的4名工人。

过程:

  1. 开始重新加载过程4次。
    1. 取消注册reload进程
    2. 重新加载数据集
    3. 注册finishReload任务
    4. 返回
  2. 重复步骤1,直到没有注册reload任务的工作人员。
  3. 启动finishReload(1)任务,直到没有可用finishReload任务的工作人员。
  4. (1)finishReload任务取消注册finishReload任务并注册reload任务然后返回。

    现在,我遇到的问题是当我更改可用于工作进程的任务时作业失败。没有错误消息或异常,只是在gearmand日志中出现“ERROR”。这是一个复制问题的快速程序。

    工人

    import gearman 
    def reversify(gmWorker, gmJob): 
            return "".join(gmJob.data[::-1]) 
    def strcount(gmWorker, gmJob): 
            gmWorker.unregister_task('reversify')  # problem line 
            return str(len(gmJob.data)) 
    worker = gearman.GearmanWorker(['localhost:4730']) 
    worker.register_task('reversify', reversify) 
    worker.register_task('strcount', strcount) 
    while True: 
            worker.work() 
    

    客户端

    import gearman 
    client = gearman.GearmanClient(['localhost:4730']) 
    a = client.submit_job('reversify', 'spam and eggs') 
    print a.result 
    >>> sgge dna maps 
    
    a = client.submit_job('strcount', 'spam and eggs') 
    ...
    

    如果有任何我可以澄清的事情,请告诉我。

    编辑:我知道有人会要求查看我提到的日志。我已经将此问题发布到Google上的gearman小组,并log is available there

2 个答案:

答案 0 :(得分:1)

看起来像是对GearmanWorker类进行子类化并添加一些标志可以解决这个问题。在我开始从工作服务器向服务器发出新命令之前,我需要允许作业完成,这似乎会中断当前作业。因此,如果我们覆盖on_job_complete函数,我们可以检查启用/禁用标志,并在发出send_job_complete命令后对其执行操作。新的工人计划如下:

工人

import gearman

def reversify(gmWorker, gmJob):
        return "".join(gmJob.data[::-1])

def enable_reversify(gmWorker, gmJob):
        myWorker.enableReversify = 1
        return 'OK'

def strcount(gmWorker, gmJob):
        myWorker.enableReversify = -1
        return str(len(gmJob.data))

class myWorker(gearman.GearmanWorker):

        enableReversify = 0 # 0 = do nothing, -1 = turn off, 1 = turn on

        def on_job_complete(self, current_job, job_result):
                self.send_job_complete(current_job, job_result)
                ### check the flag here and enable or disable tasks ###
                if myWorker.enableReversify == -1:
                        self.unregister_task('reversify')
                if myWorker.enableReversify == 1:
                        self.register_task('reversify', reversify)
                myWorker.enableReversify = 0 # reset the flag
                return True

worker = myWorker(['localhost:4730']) 
worker.register_task('reversify', reversify)
worker.register_task('strcount', strcount)
worker.register_task('enableReversify', enable_reversify)

while True:
        worker.work() 

答案 1 :(得分:0)

快速浏览一下,问题似乎是您正在开始工作,然后在工作服务器完成之前取消注册工作人员完成该工作的能力。