python 多进程


可以参考廖雪峰的博客 https://www.liaoxuefeng.com/wiki/1016959663602400/1017628290184064

我自己在树莓派开发的例子

from django.shortcuts import HttpResponse
from common.pygpio import led, sound
from multiprocessing import Process


# Create your views here.
def robot(request):
    """ionum: int gpio的引脚,17表示红灯,27表示绿灯,22表示黄灯
    freq: int 1秒之内的闪烁次数
    sec: int 持续闪烁的时间
    分级  触发动作                标志位 备注
    1级  红灯快速闪烁+音频告警 1   每秒闪烁8次,持续13秒
    2级  红灯中速闪烁          2   每秒闪烁3次,持续5秒
    3级  红灯慢速闪烁          3   每秒闪烁1次,持续3秒
    4级  黄灯闪烁                4   每秒闪烁1次,持续3秒
    5级  绿灯闪烁                5   每秒闪烁1次,持续3秒
    """
    alarm_level = int(request.GET.get('alarm_level'))
    if alarm_level == 1:
        p1 = Process(target=sound, args=("warn_sound_001", ))
        p2 = Process(target=led, args=(17, 8, 13, ))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
    elif alarm_level == 2:
        led(17, 3, 5)
    elif alarm_level == 3:
        led(17, 1, 3)
    elif alarm_level == 4:
        led(22, 1, 3)
    elif alarm_level == 5:
        led(27, 1, 3)
    return HttpResponse("alarm successfully!")

join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。

当alarm_level 为1的时候我分出两个子进程p1,p2 一个跑声音,一个跑led灯闪烁

  • 起多个进程干同一件事情,共同完成一个列表
from multiprocessing import Process, Queue, Lock


def work(x, q):
    ret_list = []
    s = 0
    for i in range(x):
        s = i + s
        ret_list.append(s)
    q.put(ret_list)


if __name__ == "__main__":
    q = Queue()
    p1 = Process(target=work, args=(3, q))
    p2 = Process(target=work, args=(4, q))
    p3 = Process(target=work, args=(5, q))
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    print(q.get())
# 执行结果
[0, 1, 3]

Process finished with exit code 0

如果要启动大量的子进程,可以用进程池Pool的方式批量创建子进程