python基础之多进程的创建、启动、阻塞

本文介绍了如何在Python中创建和管理多进程,特别是在串口通信中的应用。通过示例代码展示了如何使用`Process`创建进程,`start`方法启动进程,以及`join`方法实现进程阻塞。实验1说明了在传递参数到`Process`时的注意事项,实验2探讨了`join`方法的阻塞时间对程序流程的影响。

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()运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值