2015-06-10 38 views
0

我有一個非常簡單的工人代碼,可能會犯一些愚蠢的錯誤。工人的齒輪人功能仍未定義

class BingWorker(object): 
    def __init__(self): 
     self.gm_worker = gearman.GearmanWorker(['localhost:4730']) 
     completed_job_request = self.gm_worker.register_task('bingmedia', callBing) 

    def callBing(self, gearman_worker, gearman_job): 
     print "In worker ", gearman_job.data 
     return "Kools" 

    def run(self): 
     self.gm_worker.work() 

if __name__ == '__main__': 
    BingWorker().run() 

Traceback (most recent call last): 
    File "worker.py", line 16, in <module> 
    BingWorker().run() 
    File "worker.py", line 6, in __init__ 
    completed_job_request = self.gm_worker.register_task('bingmedia', callBing) 
NameError: global name 'callBing' is not defined 

任何提示?示例與http://gearman.org/examples/reverse/上的python示例非常相似。只是把階級結構

改進代碼:

class BingWorker(object): 
    def __init__(self): 
     self.gm_worker = gearman.GearmanWorker(['localhost:4730']) 

    def callBing(self, gearman_worker, gearman_job): 
     print "In worker ", gearman_job.data 
     return "Kools" 

    def run(self): 
     completed_job_request = self.gm_worker.register_task('bingmedia', self.callBing) 
     self.gm_worker.work() 

if __name__ == '__main__': 
    BingWorker().run() 

回答

1

您需要更改callBingself.callBing,它可能是更好的登記移到run方法的第一線,而不是__init__方法。

首先是因爲callBing缺失全局的引用,而self.callBing是對類方法的引用。第二個是因爲你可能會在初始化完成之前接到self.callBing的電話,這將是一個壞消息。

+0

我更新了代碼,請您查看 – nlper

+0

除了缺少'docstrings'之外,更新後的代碼看起來更好。真正的問題是它現在是否在執行您期望的操作? –

+0

是的,它按預期完成 – nlper