簡體   English   中英

如何在類中使用Python中的多處理

[英]How to use Multiprocessing in Python within a class

我想做的是在我的一個類方法上使用多處理。 我試圖遵循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。 我做錯了究竟是什么,我該如何解決?

好的,這就是我想程序會做的:

  1. PowerSuppy(8000,'L1') ,它啟動一個子self.print_time('tname','delay')並調用self.print_time('tname','delay') 由於'delay'不是數字,它會立即在子self.P.join()引發TypeError並結束(因此self.P.join()根本沒有阻塞)。
  2. ps1.print_time('thread1',2) ,它在主進程中運行方法並被阻塞直到結束。
  3. ps1.print_time('thread2',3)與前一行在主進程中執行的操作相同。

如何解決:

  1. 不要在__init__方法中初始化子print_time ,而是在print_time方法中初始化它。
  2. 為子進程實現了target函數的內部方法。
  3. 除非要按順序運行子Process.join否則不要運行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()))

嘗試在您的課程中添加一個功能:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM