一、python线程死锁与递归锁
死锁现象
1 2 3 |
|
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
输出结果:
1 2 3 4 |
|
2.递归锁
1 2 3 4 5 |
|
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
二、信号量
1.什么是信号量
1 2 3 4 5 |
|
2.用处
1 |
|
3.信号量使用的示例
semaphore
内部维护了一个条件变量condition
,构造函数是:
1 |
|
主要有两个方法:
1 2 |
|
用爬虫来举例,假如说有一个UrlProducer
线程,爬取url
,多个htmlSpider
线程,爬取url
对应的网页。如果直接开20个htmlSpider
线程,20个线程是同时执行的,现在要限制同时执行能执行三个,就可以使用信号量来控制:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
从结果可以看出,每次都几乎是三个同时的完成任务。
三、Event事件
1. 什么是事件
1 |
|
2. Event几种方法
event.isSet() | 返回event的状态值; |
event.wait() | 如果 event.isSet()==False将阻塞线程; |
event.set() | 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统度; |
event.clear() | 恢复event的状态值为False。 |
3.代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
四、线程队列Queue
1. 队列分类
Queue | 哪个数据先存入,取数据的时候先取哪个数据,同生活中的排队买东西 |
LifoQueue | 哪个数据最后存入的,取数据的时候先取,同生活中手枪的弹夹,子弹最后放入的先打出 |
PriorityQueue | 存入数据时候加入一个优先级,取数据的时候优先级最高的取出 |
2. Queue简介
1 |
|
Queue常用函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Queue使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
|
输出结果:
1 2 3 4 5 6 7 8 9 10 11 |
|
3. LifoQueue简介
1 |
|
LifoQueue函数介绍:
1 |
|
LifoQueue使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
输出结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
4. PriorityQueue简介
1 |
|
PriorityQueue函数介绍:
1 |
|
PriorityQueue使用:
1 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
运行结果:
1 2 3 4 5 6 7 8 9 |
|
五、Python进程池、线程池、回调函数
1. 池的概念
1 2 3 |
|
2. 进程池与线程池的使用方法(除了使用模块不一样外其他都相同)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
运行结果:
name:[进程0]|进程:[17656]正在运行 name:[进程1]|进程:[14380]正在运行 name:[进程2]|进程:[18956]正在运行 name:[进程3]|进程:[3564]正在运行 name:[进程4]|进程:[14380]正在运行 name:[进程5]|进程:[18956]正在运行 name:[进程6]|进程:[3564]正在运行 name:[进程7]|进程:[18956]正在运行 name:[进程8]|进程:[3564]正在运行 name:[进程9]|进程:[17656]正在运行 主
3.同步调用:提交任务,原地等待该任务执行完毕,拿到结果后再执行下一个任务,导致程序串行执行!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
异步调用:提交任务,不去等结果,继续执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
运行结果:
1 2 3 4 5 6 7 8 9 10 11 |
|
六、回调函数
1.什么是回调函数
1 2 3 |
|
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
运行结果:
1 2 3 4 5 6 |
|
七、定时器
Timer(定时器)是Thread的派生类,用于在指定时间后调用一个方法。
构造方法:Timer(interval, function, args=[], kwargs={})
1 2 3 |
|
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
以上内容抄自于:
1 2 3 4 |
|