Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在类中使用Python中的多处理_Python_Oop_Python Multiprocessing - Fatal编程技术网

如何在类中使用Python中的多处理

如何在类中使用Python中的多处理,python,oop,python-multiprocessing,Python,Oop,Python Multiprocessing,我想做的是在我的一个类方法上使用多处理。我曾尝试在Python帮助文件中遵循该示例,但没有得到预期的结果。这是我的班级档案: import os import telnetlib class PowerSupply(): # ---------------------------------- # def __init__(self,port_no,my_name): self.Status = "Off" self.Port = port_n

我想做的是在我的一个类方法上使用多处理。我曾尝试在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()))

当我尝试如上所述使用它时,它仍然使用过程方法,并且在thread1完成之前不会调用thread2。我到底做错了什么?我该如何修复它呢?

好的,我想程序会这样做:

  • powersupply(8000,'L1')
    处,它启动一个子进程并调用
    self.print\u time('tname','delay')
    。由于
    'delay'
    不是一个数字,它会立即在子流程中引发
    TypeError
    ,并结束(因此
    self.P.join()
    根本没有阻塞)
  • ps1.print_time('thread1',2)
    时,它运行主进程中的方法,并被阻止,直到结束
  • ps1.print\u time('thread2',3)
    执行与主进程中前一行相同的操作
  • 如何修复它:

  • 不要在
    方法中初始化子流程,而是在
    打印时间方法中初始化它
  • 为子流程的
    target
    函数实现了内部方法
  • 不要运行
    进程。除非要按顺序运行子进程,否则请加入
  • 代码如下:

    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()))
    
    导入操作系统
    导入telnetlib
    类PowerSupply():
    # ---------------------------------- #
    定义初始化(self,端口号,我的名字):
    self.Status=“关闭”
    self.Port=端口号
    self.Name=我的名字
    self.tn=无
    self.HOST=“192”
    # ---------------------------------- #
    def开启(自):
    onCommand=“输出1\r”
    如果self.Status==“开”:
    打印“我已经开始”
    其他:
    self.tn=telnetlib.Telnet(self.HOST,self.Port)
    self.tn.write(onCommand)
    self.Status=“ON”
    打印“我现在在线”
    # ---------------------------------- #
    def关闭(自):
    offCommand=“输出0\r”
    self.tn.write(offCommand)
    self.tn.close()
    打印“我现在离开”
    # ---------------------------------- #
    def设置电压(自身电压,伏特):
    voltageCommand=“PV”+“”+str(伏特)+“\r”
    self.tn.write(voltage命令)
    # ---------------------------------- #  
    def GetAllData(自):
    而(self.Status==“ON”):
    self.tn.write(“DVC?\r”)
    all_data=self.tn.read_some()
    vdc=所有数据。拆分(',')
    vdc=vdc[0]
    打印vdc
    # ---------------------------------- #
    def打印时间(自身、名称、延迟):
    P=进程(目标=自身。\打印\时间,参数=(tname,延迟))
    P.开始()
    定义打印时间(t名称、延迟):
    计数=0
    当计数小于5时:
    时间。睡眠(延迟)
    计数+=1
    打印“%s:%s”%(t名称,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

    您的代码有语法错误(
    self.p=Process(target=self.print\u time,args=('tname','delay')
    ),你漏掉了几行吗?只是一个小括号。闭包是不可pickle的;它们不适合于
    多处理
    lambda
    s也是如此。你只能pickle顶级函数或可pickle类的方法。@Philip Tzou,你的解决方案很好!我想指出的一点是,当我测试新的类/方法时,它是在Python解释器中,Works很好,但在IDLE中没有响应。当我在IDLE中运行它时,它绝对不会返回任何结果。有什么想法吗?谢谢。@Deete你是说它在IDLE中根本不工作还是不输出?
    ps1 = PowerSupply(8000,'L1')
    ps1.print_time_subprocess('thread1',2)
    ps1.print_time_subprocess('thread2',3)