worker 中的 gearman 函数仍未定义

gearman function in worker remains undefined

我有非常简单的工人代码,可能会犯一些愚蠢的错误。

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 结构

改进代码:

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()

您需要将 callBing 更改为 self.callBing 并且将注册移动到 运行 方法的第一行而不是 __init__ 方法可能会更好.

拳头是因为 callBing 是对 missing 全局的引用,而 self.callBing 是对 类 方法的引用。第二个是因为你可能会在 init 完成之前接到 self.callBing 的电话,这将是个坏消息。