2016-10-18 24 views
0

我想要做的是在我的一個類方法中使用多處理。我試圖按照Python幫助文件中的例子,但沒有得到預期的結果。這裏是我的類文件:如何在類中使用Python中的多處理

import os 
import telnetlib 

class PowerSupply(): 

    # ---------------------------------- # 
    def __init__(self,port_no,my_name): 
     self.Status = "Off" 
     self.Port = port_no 
     self.Name = my_name 
     self.tn = None 
     self.HOST = "192" 
     self.P = Process(target=self.print_time, args=('tname','delay') 
     self.P.start() 
     self.P.join() 
    # ---------------------------------- # 
    def TurnOn(self): 
     onCommand = "OUT 1\r" 

     if self.Status == "ON": 
      print "I'm already on" 
     else: 
      self.tn = telnetlib.Telnet(self.HOST,self.Port) 
      self.tn.write(onCommand) 
      self.Status = "ON" 
      print "I am now on" 
    # ---------------------------------- # 
    def TurnOff(self): 
     offCommand = "OUT 0\r" 
     self.tn.write(offCommand) 
     self.tn.close() 
     print "I am now off" 
    # ---------------------------------- # 
    def SetVoltage(self,volts): 
     voltageCommand = "PV" + " " + str(volts) + "\r" 
     self.tn.write(voltageCommand) 
    # ---------------------------------- # 
    def GetAllData(self): 
     while(self.Status == "ON"): 
      self.tn.write("DVC?\r") 
      all_data = self.tn.read_some() 
      vdc = all_data.split(',') 
      vdc = vdc[0] 
      print vdc 
    # ---------------------------------- # 
    def print_time(self, tname, delay): 
     count = 0 
     while count < 5: 
     time.sleep(delay) 
     count += 1 
     print "%s: %s"%(tname, time.ctime(time.time())) 

這裏是我嘗試使用執行:

ps1 = PowerSuppy(8000,'L1') 
ps1.print_time('thread1',2) 
ps1.print_time('thread2',3) 

當我嘗試如上使用它,它依然採用的處理方式,並且不調用thread2直到thread1完成。我做錯了什麼,我該如何解決?

+0

你的代碼有語法錯誤('self.P = Process(target = self.print_time,args =('tname','delay')'),你是否錯過了行? –

+0

只是一個接近的括號。 – DeeTee

回答

1

好了,這裏就是我想節目會做:

  1. PowerSuppy(8000,'L1'),它啓動一個子進程,並呼籲self.print_time('tname','delay')。由於'delay'不是數字,它立即在子流程中提高TypeError並結束(因此self.P.join()根本沒有阻止)。
  2. ps1.print_time('thread1',2),它運行主進程中的方法並被阻塞直到它結束。
  3. ps1.print_time('thread2',3)和前一行在主進程中做的事情是一樣的。

如何解決此問題:

  1. 不要在__init__方法初始化子,而是在print_time方法初始化。
  2. 實現子進程的target函數的內部方法。
  3. 除非要按順序運行子進程,否則不要運行Process.join

下面的代碼:

import os 
import telnetlib 

class PowerSupply(): 

    # ---------------------------------- # 
    def __init__(self,port_no,my_name): 
     self.Status = "Off" 
     self.Port = port_no 
     self.Name = my_name 
     self.tn = None 
     self.HOST = "192" 

    # ---------------------------------- # 
    def TurnOn(self): 
     onCommand = "OUT 1\r" 

     if self.Status == "ON": 
      print "I'm already on" 
     else: 
      self.tn = telnetlib.Telnet(self.HOST,self.Port) 
      self.tn.write(onCommand) 
      self.Status = "ON" 
      print "I am now on" 
    # ---------------------------------- # 
    def TurnOff(self): 
     offCommand = "OUT 0\r" 
     self.tn.write(offCommand) 
     self.tn.close() 
     print "I am now off" 
    # ---------------------------------- # 
    def SetVoltage(self,volts): 
     voltageCommand = "PV" + " " + str(volts) + "\r" 
     self.tn.write(voltageCommand) 
    # ---------------------------------- # 
    def GetAllData(self): 
     while(self.Status == "ON"): 
      self.tn.write("DVC?\r") 
      all_data = self.tn.read_some() 
      vdc = all_data.split(',') 
      vdc = vdc[0] 
      print vdc 
    # ---------------------------------- # 
    def print_time(self, tname, delay): 
     P = Process(target=self._print_time, args=(tname, delay)) 
     P.start() 

    def _print_time(tname, delay): 
     count = 0 
     while count < 5: 
      time.sleep(delay) 
     count += 1 
     print "%s: %s"%(tname, time.ctime(time.time())) 
+0

關閉不可pickleable;他們對'多處理'不好。 'lambda's也一樣。你只能挑選頂級函數或者pickleable類的方法。 – ShadowRanger

+0

@ShadowRanger謝謝,我沒有注意到。 –

+0

@Philip Tzou,您的解決方案非常棒!我想指出的一件事是,當我測試新的類/方法時,它在Python解釋器中工作正常,但我在IDLE中沒有得到任何響應。當我在IDLE中運行它時,它絕對不會返回任何內容。有任何想法嗎?謝謝。 – DeeTee

1

嘗試在你的類增加一個功能:

def print_time_subprocess(self, tname, delay): 
    p = Process(target=self.print_time, args=('tname','delay')) 
    p.start() 

,並用它來測試:

ps1 = PowerSupply(8000,'L1') 
ps1.print_time_subprocess('thread1',2) 
ps1.print_time_subprocess('thread2',3) 

,不要忘記進口Process

相關問題