2016-10-18 1 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) 

私は上記のようにそれを使用しようとすると、それはまだ手続きアプローチを使用して呼び出すことはありません。 thread1が完了するまでthread2を返します。私が間違っていることを正確には何ですか、どうすれば修正できますか?

+0

コードに構文エラーがあります( 'self.P = Process(target = self.print_time、args =( 'tname'、 'delay')')。 –

+0

ちょうど閉じ括弧。 – DeeTee

答えて

1

[OK]を、ここで私はプログラムが行いますと仮定ものです:PowerSuppy(8000,'L1')

  1. 、それはサブプロセスを開始し、self.print_time('tname','delay')を呼び出します。 'delay'は数字ではないので、すぐにサブプロセスと終了でTypeErrorを生成します(したがってself.P.join()はブロックしませんでした)。
  2. ps1.print_time('thread1',2)には、メインプロセスで実行され、終了するまでブロックされます。
  3. ps1.print_time('thread2',3)前の行と同じことがメインプロセスで行われました。
それを修正する方法

  1. print_time方法でそれを初期化し、代わりに、__init__方法でサブプロセスを初期化しないでください。
  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クラスのメソッドだけをpickleできます。 – 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

関連する問題