2013-02-25 48 views
0

向后移植到V2.4我有下面的代码工作正常使用Python 2.7+蟒蛇:线程问题,而从V2.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() 
+0

你确定它没有错误退出吗?如果'threading.Thread'不是2.4 – entropy 2013-02-25 22:04:08

+0

中的新式类,那么我肯定可以看到它出错了。对不起,您是对的,出现错误。错误logger.exception(e)在except块中被删除。用错误更新问题。 – Prasanna 2013-02-25 22:09:12

+0

看起来像一个非常奇怪的错误。 'threadTargMethod()'不会显示在谷歌的任何地方。 – entropy 2013-02-25 22:20:53

回答

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一个空的字典(与文档相匹配 - 你似乎有2.7的幸运)

  • 不包括verbose参数(在2.4或2.7不支持 - 不知道发生了什么事有)

  • 使名称明确

随着这种变化,你可以继续开始

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

因为kwargs会在默认情况下正确设置。

0

,我要开始线程以v2.4中的以下方式:

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

在V2.7我开始通过以下方式和它的作品

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