worker中的gearman函数尚未定义

2024-10-03 17:21:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有相当简单的代码的工人,可能是做了一些愚蠢的错误。你知道吗

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

Tags: runselfregistertaskinitrequestdefjob
1条回答
网友
1楼 · 发布于 2024-10-03 17:21:55

您需要将callBing更改为self.callBing,最好将注册移到run方法的第一行,而不是__init__方法。你知道吗

第一个是因为callBing是对丢失的全局的引用,而self.callBing是对classes方法的引用。第二个原因是,在init完成之前,可能会接到一个对self.callBing的调用,这将是个坏消息。你知道吗

相关问题 更多 >