簡體   English   中英

在作業處理期間更改python-gearman worker任務

[英]Altering python-gearman worker tasks during job processing

我試圖在其工作周期中更改python-gearman worker上可用的任務。 我這樣做的原因是允許我對工作進程進行一點控制,並允許它們從數據庫中重新加載。 我需要每個工作人員定期重新加載,但我不想簡單地終止進程,並且我希望該服務始終可用,這意味着我必須分批重新加載。 因此,我將有4名工人重新裝載,而另外4名工人可供處理,然后再裝載下4名工人。

處理:

  1. 開始重新加載過程4次。
    1. 注銷reload過程
    2. 重新加載數據集
    3. 注冊finishReload任務
    4. 返回
  2. 重復步驟1,直到沒有注冊reload任務的工作人員為止。
  3. 啟動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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM