我正在尝试在其工作周期中更改python-gearman worker上可用的任务。我这样做的原因是允许我对我的工作进程进行一点控制,并允许它从数据库重新加载。我需要每个工人定期重新加载,但我不想简单地杀死进程,我希望服务始终可用,这意味着我必须分批重新加载。所以我会重新装载4名工人,另有4名工人可以处理,然后重新装载接下来的4名工人。
过程:
reload
进程finishReload
任务reload
任务的工作人员。finishReload
(1)任务,直到没有可用finishReload
任务的工作人员。(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。答案 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)
快速浏览一下,问题似乎是您正在开始工作,然后在工作服务器完成之前取消注册工作人员完成该工作的能力。