2015-09-17 65 views
0

我正在創建一個類,其中有幾個方法使用線程。我應該把一個線程類放入一個類方法還是放在一個方法外

要使用線程,我經常創建一個線程的子類。我應該在頂層這樣創建Thread:

class mainclass(object): 

    def __init__(self,): 
     pass 

    def method_a(self,): 
     print('method_a start') 
     tlist = list(range(10)) 
     ps = [subthread(tlist) for i in range(4)] 
     for p in ps: 
      p.start() 
     for p in ps: 
      p.join() 
     print('method_a finish', tlist) 


class subthread(threading.Thread): 

    def __init__(self, alist): 
     threading.Thread.__init__(self) 
     self.alist = alist 

    def run(self,): 
     while self.alist: 
      t = self.alist.pop(0) 
      print(self.getName(), t) 
      sleep(1) 

或進入的方法,使用這樣的:

class mainclass(object): 

    def __init__(self,): 
     pass 

    def method_a(self,): 
     class subthread(threading.Thread): 

      def __init__(self, alist): 
       threading.Thread.__init__(self) 
       self.alist = alist 

      def run(self,): 
       while self.alist: 
        t = self.alist.pop(0) 
        print(self.getName(), t) 
        sleep(1) 

     print('method_a start') 
     tlist = list(range(10)) 
     ps = [subthread(tlist) for i in range(4)] 
     for p in ps: 
      p.start() 
     for p in ps: 
      p.join() 
     print('method_a finish', tlist) 

據我所知,如果我用的是第二,類方法可能會很長, 和似乎jedi.vim無法正常工作。

如果我使用第一個,對於每個類方法,我必須創建一個不同名稱的頂級類,我只能在一個地方使用。

那我該用哪個?

回答

0

你並不需要創建一個類。如果它只是運行方法,則可以通過目標參數直接將方法傳遞給Thread類:

class Main(object): 

    def run(self, alist, thread_id): 
     while alist: 
      t = alist.pop(0) 
      print(thread_id, t) 
      sleep(1) 

    def method_a(self): 
     print('method_a start') 
     tlist = list(range(10)) 
     ps = [Thread(target=self.run, args=(tlist, i)) for i in range(4)] 
     for p in ps: 
      p.start() 
     for p in ps: 
      p.join() 
     print('method_a finish') 
+0

參數'thread_id'解決了我的問題,就是這樣! – jjwt

相關問題