摘要: 1. 线程池 开启线程的成本要比开启进程的成本低,但是也不能任意的开线程,可以使用线程池 使用concurrent的futures模块(futures.ThreadPoolExecutor 导入线程池; futures.ProcessPoolExecutor 导入进程池); 一般开进程池的数目是 c 阅读全文
posted @ 2018-10-15 22:38 写的BUG代码少 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 1. 队列 运行结果: 2. LOFI后进先出的队列 栈 运行结果: 3. 带有优先级的队列 运行结果: 4. 使用多线程借助队列实现生产者消费者模型 运行结果: 阅读全文
posted @ 2018-10-15 21:13 写的BUG代码少 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 1. 定时器,定时开启一个线程 执行任务,接收两个参数(第一个就是隔多久开启,单位秒,第二个参数就是开启线程需要执行的任务,也就是函数名) 运行结果: 比较下面两段代码,说一下不同点: 第一种 就是开一个线程,执行func1函数(死循环)所以开的线程会一直存在,第二种 是每隔一段时间去开一个线程执行 阅读全文
posted @ 2018-10-15 20:22 写的BUG代码少 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 1. 事件 其实就是一种标志,事件默认阻塞状态,阻塞状态下执行e.wait()就会一直陷入阻塞状态(但是e.wait(10)就是设置在阻塞状态下 e.is_set()=False时只阻塞10秒就结束) ; e.set() 设置非阻塞状态,此时e.is_set()=True 并且执行e.wait()不 阅读全文
posted @ 2018-10-15 17:37 写的BUG代码少 阅读(114) 评论(0) 推荐(0) 编辑
摘要: 1. 信号量 信号量本质上还是锁,只不过这个锁有很多把钥匙,同一时间只允许有限个线程进程操作(实现有限个数据的并发),但是线程数开了很多个的(信号量的参数不是开的线程数。只是代表同一时间允许并发的线程数) 运行结果: 信号量与线程池的异同点: 相同:在信号量的acquire之后,同一时间只能有有限个 阅读全文
posted @ 2018-10-15 16:55 写的BUG代码少 阅读(146) 评论(0) 推荐(0) 编辑
摘要: 1. 守护线程 设置子线程为守护线程,则守护线程的代码会等待主线程代码执行完毕而结束: 运行结果: 再来看一个例子: 运行结果: 2. GIL全局解释器锁 只是锁线程,并不能真正保证数据安全 GIL只是在线程上加锁,可以保证同一时间只能有一个线程操作数据,但是并没有直接对数据加锁,所以对某些特殊情况 阅读全文
posted @ 2018-10-15 16:15 写的BUG代码少 阅读(193) 评论(0) 推荐(0) 编辑