主要内容:

一. 锁

二. 信号量

三. 事件

  通过event来完成红绿灯模型

四. 队列(重点)

  队列实现进程间的通信

五. 生产者消费者模型

  1. 初始版本(程序会阻塞住)

  2. 升级版本一(通过抛出异常信号的方式结束进程)

  3. 升级版本二(通过发送结束信号的方式结束进程) 

    第一种: 生产者发结束信号

    第二种: 主进程发结束信号

  4. 升级版本三(有多个消费者和生产者的时候需要发送多次结束信号)

六. JoinableQuene实现生产者消费者模型 

 

 

一. 进程同步(锁)

在之前muitiprocessing模块的学习中,当我们使用Process创建子进程时就已经实现了进程的异步了.我们可以让多个任务同时在几个进程中并发处理,它们之间的运行没有顺序,一旦开启也不受人们控制. 尽管并发编程让我们能更加充分的利用IO资源,但与此同时它也带来了新的问题:  进程之间数据不共享但却共享同一套文件系统, 所以几个进程同时访问同一个文件或同一个打印终端,是没有问题的. 可是, 共享带来的是竞争, 竞争的结果就是错乱. 如何进行控制?我们想到了"加锁处理".

import random, os, time
from multiprocessing import Process

def work(n):
    print("{} >>> {}号进程正在执行".format(n, os.getpid()))
    time.sleep(random.random())
    print("{} >>> {}号进程执行完毕".format(n, os.getpid()))

if __name__ == '__main__':
    for i in range(5):
        p = Process(target=work, args=(i,))
        p.start()
        
# 执行结果:
# 0 >>> 9748号进程正在执行
# 1 >>> 10904号进程正在执行
# 2 >>> 8976号进程正在执行
# 3 >>> 5784号进程正在执行
# 4 >>> 12132号进程正在执行
# 4 >>> 12132号进程执行完毕
# 2 >>> 8976号进程执行完毕
# 3 >>> 5784号进程执行完毕
# 1 >>> 10904号进程执行完毕
# 0 >>> 9748号进程执行完毕
多进程抢占输出资源,导致打印混乱

相关文章: