Python高级编程6:线程
一、数据的中转站:队列(Queue)
在多进程环境中,由于进程间内存是不互通的,我们需要一个“中转站”来输入数据。队列就是这个公平的容器。它遵循FIFO(先进先出)原则,像队列买票一样,先存进去的数据先被取出来。
1.基础操作:存与取
使用multiprocessing.Queue可以轻松创建队列。
2.实战:生产者-消费者模式
我们可以创建一个进程负责写数据(生产者),另一个进程负责读高效数据(消费者),实现战斗。
二、资源的守护者:互斥锁(Lock)
当多个进程访问同一个数据(如数据库、文件)时,如果不加控制,就会出现“数据异常”或“超卖”问题。
生活案例: 互斥锁就像家里的货物——只有一个人进入后关门上锁,后面的人必须在门口等待,直到里面的人出来开锁。
抢票案例分析: 在不加锁的情况下,多个进程可能同时认为还有抢票,导致超卖。使用lock.acquire()并lock.release()可以保证一次只有一个进程能操作抢票数。
Python

三、信号量(Semaphore)
信号量也是一种锁,但它相当于把入口的锁。它允许指定数量的同时进入进程共享区域。
比喻: 信号量就像停车场的车位限额——显示剩余车位数量,只有当剩余位大于0时,车辆才能进入。
Python

四、进程的小弟:线程(Thread)
线程是执行任务的最小单位,它依附于进程存在,并且不单独分配内存空间,而是共享每个进程的资源。
基本对比:
-
进程(Process):资源开销大,但数据不共享,安全性高,适合计算密集型任务。
-
线程(Thread):资源开销小,数据共享(通过
global修改全局变量),适合IO密集型任务。
自定义线程类: 除了直接调用,我们还可以通过继承threading.Thread来自定义自定义的线程工具。
Python
五、避坑指南:死锁(Deadlock)
锁虽然好用,但用错了会翻车。死锁是指两个或多个进程/线程相互等待对方释放资源,导致程序永远卡死。
经典场景: 梦山在等笔(锁2)处拿到了本子(锁1),阿辰在等本子(锁1)处拿到了笔(锁2)。彼此互不相让,陷入死循环。
如何避免?
-
社区获取资源:所有权按指定顺序获取资源。
-
超时放弃:设置
timeout,超时未达到就主动释放已占有的资源。
Python

六、线程安全的队列(queue.Queue)
在多线程开发中,使用queue.Queue可以完美解决线程间通信问题。它自带锁机制,不需要开发者手动处理线程安全问题。
总结
| 特性 | 进程 | 线程 |
| 资源开销 | 大 | 小 |
| 数据共享 | 不分享 | 共享 |
| 安全性 | 高 | 低 |
| 应用场景 | CPU密集型 | IO 密集型 |
每日励志文案:
何时葡萄先熟透,你要静候再静候
更多推荐




所有评论(0)