Process()创建进程、start方法启动进程、join方法阻塞进程
1 实验1
有如下代码,命令行中运行后会报错,对象实例不能作为参数传入到Process函数
#打印字节函数
def print_hex(bytes):
l = [hex(int(i)) for i in bytes]
print(" ".join(l))
#串口接收超时函数
def serial_recv():
while True:
sleep(1)
#data = ser.read_all()
data = ser.read(4)
print('process serial')
print(data)
if data == b'':
command=[0x5A,0xA5,0x07,0x82,0x00,0x84,0x5A,0x01,0x00,0x0C]#切换到页面0x0C
print_hex(command)
ser.write(command)
else:
print('get data')
return data
#主函数
if __name__ == '__main__':
port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list)==0:
print('无可用串口')
else:
print('可以使用的串口有:')
for i in range(0,len(port_list)):
print(i)
print(port_list[i])
print(port_list[i][0])
sernum='COM3'
baudrate=115200
ser = serial.Serial(sernum,baudrate,bytesize=8,parity='N',timeout=30)
if ser.isOpen():
print('成功打开串口',sernum)
else:
print('打开串口s%失败',sernum)
print(ser)
pr1 = Process(target=serial_recv,args=(ser))
pr1.start()
pr1.join()
print('parent process is running')
更改主函数和serial_recv()部分代码即可,更改后的代码如下:
def serial_recv():
sernum='COM3'
baudrate=115200
ser = serial.Serial(sernum,baudrate,bytesize=8,parity='N',timeout=3)
while True:
sleep(1)
#data = ser.read_all()
data = ser.read(4)
print('process serial')
print(data)
if data == b'':
command=[0x5A,0xA5,0x07,0x82,0x00,0x84,0x5A,0x01,0x00,0x0C]#切换到页面0x0C
print_hex(command)
ser.write(command)
else:
print('get data')
return data
#主函数
if __name__ == '__main__':
pr1 = Process(target=serial_recv,args=())
pr1.start()
pr1.join()
print('parent process is running')
2 实验2
因为serial_recv()函数是个死循环,启动后将永不阻塞,父进程中的print('parent process is running')永不执行。
如果设置阻塞时间,pr1.join(5),则5s后该进程会阻塞并返回父进程运行print('parent process is running'),再进入serial_recv()运行。
本文介绍了如何在Python中创建和管理多进程,特别是在串口通信中的应用。通过示例代码展示了如何使用`Process`创建进程,`start`方法启动进程,以及`join`方法实现进程阻塞。实验1说明了在传递参数到`Process`时的注意事项,实验2探讨了`join`方法的阻塞时间对程序流程的影响。
1314

被折叠的 条评论
为什么被折叠?



