[英]Altering python-gearman worker tasks during job processing
我試圖在其工作周期中更改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組,並在那里提供了日志 。
看起來好像繼承了GearmanWorker類,並添加了一些標志可以解決此問題。 在開始從工作程序向服務器發出新命令之前,我需要允許該工作完成,這似乎會中斷當前工作。 因此,如果我們覆蓋on_job_complete
函數,我們可以檢查enable / disable標志,並在發出send_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()
乍一看,問題似乎是您正在開始工作,然后在工作服務器完成之前從工作服務器中注銷工人的工作能力。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.