python:从v2.7向后移植到v2.4时的线程问题

时间:2013-02-25 21:56:46

标签: python multithreading

我有以下代码可以正常使用python 2.7 +

class Worker(threading.Thread):
    def __init__(self, group=None, target=None, name=None,
                 args=(), kwargs=None, verbose=None, onCompleteCb=None):
        self.__onCompleteCb = onCompleteCb
        self.__name = name
        super(Worker, self).__init__(group, target, name, args, kwargs, verbose)

    def getName(self):
        return self.__name

    def run(self):
        try:
            super(Worker, self).run()
            if self.__onCompleteCb is not None: self.__onCompleteCb(self.__name)
        except Exception, e:
            if self.__onCompleteCb is not None: self.__onCompleteCb(self.__name, failed=True, exception=e)

但是我最近发现我的代码应该支持从2.4开始的版本:在上面的代码中,运行被调用但是当它调用super(Worker, self).run()时,我看到以下错误

 TypeError: threadTargMethod() argument after ** must be a dictionary

我应该在python 2.4中以不同方式调用super吗?

解决方案 我必须以下列方式启动该线程:

Worker(target=threadTargMethod, name="thread1", args=(), kwargs={}).start()

在v2.7中,我开始以下方式运行

Worker(target=threadTargMethod, name="thread1").start()

1 个答案:

答案 0 :(得分:1)

我建议您将代码更改为:

class Worker(threading.Thread):
    def __init__(self, group=None, target=None, name=None,
             args=(), kwargs={}, verbose=None, onCompleteCb=None):
        ...
        super(Worker, self).__init__(group=group, target=target, name=name, 
                                     args=args, kwargs=kwargs)

换句话说:

  • kwargs的默认值设为空dict(与文档相匹配 - 您似乎很幸运获得2.7)

  • 不要包含verbose参数(2.4或2.7不支持 - 不知道那里发生了什么)

  • 明确名称

通过此更改,您可以继续

开始
Worker(target=threadTargMethod, name="thread1").start()

因为kwargs默认设置正确。