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