2013-02-25 49 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()