一、数据的中转站:队列(Queue)

在多进程环境中,由于进程间内存是不互通的,我们需要一个“中转站”来输入数据。队列就是这个公平的容器。它遵循FIFO(先进先出)原则,像队列买票一样,先存进去的数据先被取出来。

1.基础操作:存与取

使用multiprocessing.Queue可以轻松创建队列。

Python
2.实战:生产者-消费者模式

我们可以创建一个进程负责写数据(生产者),另一个进程负责读高效数据(消费者),实现战斗。

Python


二、资源的守护者:互斥锁(Lock)

当多个进程访问同一个数据(如数据库、文件)时,如果不加控制,就会出现“数据异常”或“超卖”问题。

生活案例: 互斥锁就像家里的货物——只有一个人进入后关门上锁,后面的人必须在门口等待,直到里面的人出来开锁。

抢票案例分析: 在不加锁的情况下,多个进程可能同时认为还有抢票,导致超卖。使用lock.acquire()lock.release()可以保证一次只有一个进程能操作抢票数。

Python


三、信号量(Semaphore)

信号量也是一种锁,但它相当于把入口的锁。它允许指定数量的同时进入进程共享区域。

比喻: 信号量就像停车场的车位限额——显示剩余车位数量,只有当剩余位大于0时,车辆才能进入。

Python


四、进程的小弟:线程(Thread)

线程是执行任务的最小单位,它依附于进程存在,并且不单独分配内存空间,而是共享每个进程的资源。

基本对比:

  • 进程(Process):资源开销大,但数据不共享,安全性高,适合计算密集型任务。

  • 线程(Thread):资源开销小,数据共享(通过global修改全局变量),适合IO密集型任务。

自定义线程类: 除了直接调用,我们还可以通过继承threading.Thread来自定义自定义的线程工具。

Python



五、避坑指南:死锁(Deadlock)

锁虽然好用,但用错了会翻车。死锁是指两个或多个进程/线程相互等待对方释放资源,导致程序永远卡死。

经典场景: 梦山在等笔(锁2)处拿到了本子(锁1),阿辰在等本子(锁1)处拿到了笔(锁2)。彼此互不相让,陷入死循环。

如何避免?

  1. 社区获取资源:所有权按指定顺序获取资源。

  2. 超时放弃:设置timeout,超时未达到就主动释放已占有的资源。

Python


六、线程安全的队列(queue.Queue)

在多线程开发中,使用queue.Queue可以完美解决线程间通信问题。它自带锁机制,不需要开发者手动处理线程安全问题。

Python

总结

特性 进程 线程
资源开销
数据共享 不分享 共享
安全性
应用场景 CPU密集型 IO 密集型

每日励志文案:

何时葡萄先熟透,你要静候再静候

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐