【问题标题】:gearman function in worker remains undefinedworker 中的 gearman 函数仍未定义
【发布时间】:2015-06-10 06:03:50
【问题描述】:

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

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

【问题讨论】:

    标签: python gearman


    【解决方案1】:

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

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

    【讨论】:

    • 除了缺少docstrings 之外,更新后的代码看起来更好。真正的问题是它现在是否达到了您的预期?
    • 是的,效果符合预期
    猜你喜欢
    • 2019-03-25
    • 2018-10-30
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    相关资源
    最近更新 更多