2013-03-01 88 views
0

從線程sublassing時通過自定義函數我有這樣的代碼我怎麼能在Python

class MyTh(threading.Thread): 

    def __init__(self, group=None, target=None, name=None, 
       args=(), kwargs=None, verbose=None): 
     threading.Thread.__init__(self, group=group, target=target, name=name, 
            verbose=verbose) 
     self.args = args 
     self.kwargs = kwargs 
     return 

    def run(self): 
     logging.debug('running with %s and %s', self.args, self.kwargs) 
     return 

def my_func(): 
    print 'Everything OK' 

當我做到這一點

t1 = MyTh(name='Thread '+ str(i), target=myfunc, args=("test",), kwargs={'a':'A', 'b':'B'}) 
    t1.start() 

我的目標函數是不是在所有調用。我怎麼能讓我的線程調用目標中給出的默認功能

+0

你的基本設置正常工作對我來說,除了'目標= myfunc'應該是'target = my_func' – 2013-03-01 09:12:23

回答

1

通過重寫run()方法,你搞砸了標準run()並且永遠不會調用目標。你需要做的是要麼不覆蓋的方法或重寫它像這樣:

def run(self): 
    logging.debug('running with %s and %s', self.args, self.kwargs) 
    super(MyTh, self).run() 
    return 

這樣的標準Thread.run也被稱爲並執行target

此外,您還沒有將argskwargs傳遞給Thread的構造函數。您需要有:

threading.Thread.__init__(self, group=group, target=target, name=name, 
           verbose=verbose, args=args, kwargs=kwargs) 

爲了正確設置它們。然後你就可以改變你的my_func到:

def my_func(arg1, a, b): 
    print arg1, a, b 
    print 'Everything OK' 

此外,MyTh的構造和Thread.__init__電話是不必要的長。這是很多短,可讀:

def __init__(self, *args, **kwargs): 
    threading.Thread.__init__(self, *args, **kwargs) 
    self.args = kwargs['args'] 
    self.kwargs = kwargs['kwargs'] 

通知您傳遞給構造argskwargs如何實際上訪問的kwargs['args']kwargs['kwargs']

+0

這是工作,但我的論證'測試'不能在myfunction裏面訪問,我怎麼能得到那 – user192362127 2013-03-01 09:12:59

+0

@ user192362127看看編輯。還有一個關於如何讓你的自定義'MyTh'更具可讀性的建議。 – dmg 2013-03-01 09:26:12