锁是怎么存在的?

在python建立之初,开发者目的是为了快速把语言开发出来,如果加上GIL(c语言加锁),切换时按照100条字节指令来进行线程间的切换

为什么加锁?

非线程安全,控制一段代码

1.lock = threading.BoundedSemaphore一次可以限制关卡,限制通行次数,不过这个是写死的
 1 import time
 2 import threading
 3 lock = threading.BoundedSemaphore(3)#一次放三个(一次只通行三个)
 4 def func(arg):
 5     lock.acquire()
 6     time.sleep(1)
 7     print(arg)
 8     lock.release()
 9 for i in range(20):
10     t = threading.Thread(target=func, args=(i,))
11     t.start()

2.

lock = threading.Condition()
一次可以限制关卡,限制通行次数,不过这个是写活的
可以自定义加载个数 ,只需在后面便利后加一个参数
lock.notify(inp) inp 来限制次数
 1 lock = threading.Condition()
 2 def func(arg):
 3     print('线程进来了')
 4     lock.acquire()
 5     lock.wait() # 加锁这个特殊需要等待参数传递
 6     print(arg)
 7     time.sleep(1)
 8     lock.release()
 9 for i in range(10):
10     t =threading.Thread(target=func,args=(i,))
11     t.start()
12 while True:
13     inp = int(input('>>>'))
14     lock.acquire()
15     lock.notify(inp)#加的控制次数的 这个是特殊的
16     lock.release()

3.

lock = threading.Event()  获取全部注意.获取全部使用   lock.wait() 加锁的
input(">>>>") 是用来控制是否全部获取的一个开关,一旦输入 ,解锁会获取全部  后面需要加入 lock.set() 绿灯如果想再次使用这个函数, lock.clear() 重新清空
 1 import time
 2 import threading
 3
 4 lock = threading.Event()
 5
 6 def func(arg):
 7     print('线程来了')
 8     lock.wait() # 加锁:红灯
 9     print(arg)
10 for i in range(10):
11     t =threading.Thread(target=func,args=(i,))
12     t.start()
13 input(">>>>")
14 lock.set() # 绿灯
15 lock.clear() # 再次变红灯
16 for i in range(10):
17     t =threading.Thread(target=func,args=(i,))
18     t.start()
19 input(">>>>")
20 lock.set()

4.

 v = threading.local()#内部创建一个属于自己的值 phone=arg 为了区分自己拿的包
 1 import time
 2 import threading
 3 v = threading.local()
 4 def func(arg):
 5     # 内部会为当前线程创建一个空间用于存储:phone=自己的值
 6     v.phone = arg
 7     time.sleep(2)
 8     print(v.phone,arg) # 去当前线程自己空间取值
 9 for i in range(10):
10     t =threading.Thread(target=func,args=(i,))
11     t.start()

线程池: 用来约束每次输出的次数,不是全部哪出啊,可以限制一次拿出几个

1 from concurrent.futures import ThreadPoolExecutor
2 import  time
3 def func(a1,a2):
4     time.sleep(5)
5     print(a1,a2)
6 a=ThreadPoolExecutor(4)#实例化对象让其限制次数
7 for i  in  range(40):
8     a.submit(func,i,15)

生产者,消费者模型

这种模型在多线程中属于按顺序使用  现有生产才有消费,这个是一个固定顺序,而在函数中,为了更明确这种概念而不考虑生产时间限制

来更符合逻辑性 出现了queue 模块  首先实例化对象  q=queue.Queue 在用方法q.put(" ") 括号里面必须有字符串提示从这里入,符合队列(先进先出)而抛开逻辑

后面用q.get( ) 方法提示出来了

 1 import time
 2 import threading
 3 import queue
 4 q=queue.Queue()#实例化对象
 5 def mk(id):
 6     while 1:
 7         time.sleep(3)
 8         q.put("布加迪")#首先进入q.put
 9         print("师傅%s 生产了一个布加迪"% id)
10 for i  in  range(1,3):
11     t=threading.Thread(target=mk,args=(i,))
12     t.start()
13 def et(id):
14     while 1:
15         time.sleep(1)
16         v1=q.get()#然后冲进去
17         print("连达%s 吃了一个布加迪"% id)
18 for i  in  range(1,6):
19     t1=threading.Thread(target=et,args=(i,))
20     t1.start()

转载于:https://www.cnblogs.com/zhangqing979797/p/9628884.html

多线程锁,线程池,消费者生产者模型相关推荐

  1. Android工程师进阶第五课 多线程锁,线程池和DVM/ART优化

    第09讲:Java 线程优化 偏向锁,轻量级锁.重量级锁 我目前所在的公司是一家跨国企业,总部在瑞典.前段时间公司新开发的一个应用准备发布到应用宝平台.但是在发布之前,需要准备一系列软著相关的证明材料 ...

  2. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

  3. C++多线程以及线程池

    1 线程 1.1 简介   线程(英语:thread)是操作系统能够进行运算调度的最小单位.大部分情况下,它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程 ...

  4. 后端开发【一大波有用知识】Redis中的IO多线程(线程池)

    一.Redis中的IO多线程原理 ​服务端收到一条信息,给它deconde成一条命令 然后根据命令获得一个结果(reply) 然后将结果encode后,发送回去 redis的单线程是指,命令执行(lo ...

  5. Linux服务器7 --- 多路IO复用+线程池服务端模型(高并发)分析

    一.服务端特性概述 1.使用EPOLL模型在服务器中加入(网络IO监听,大量的监听能力) EPOLL采用边缘触发模式(后话) 2.线程池模型进行并发处理业务(并发处理能力) 1)提高线程重用性(避免频 ...

  6. 多线程编程—线程池的实现

    多线程编程-线程池的实现 执行与任务分离的组件- 线程池 https://github.com/wangbojing/threadpool 多线程技术主要解决了处理器单元内多个线程执行的问题,它可以显 ...

  7. java多线程及线程池使用

    Java多线程及线程池的使用 Java多线程 一.Java多线程涉及的包和类 二.Java创建多线程的方式 三.Java线程池 1. 创建线程池ThreadPoolExecutor的7个参数 2. 线 ...

  8. 面试必问:多线程与线程池

    前言 前几章都在讲一些锁的使用和原理,主要是为了保证多线程情况下变量的原子性,但这并不是说多线程不好,合理利用还是有好处的.至于什么好处,看下面内容就懂了,先打个比方吧(谁叫比方,上来挨打):假如你体 ...

  9. Java的多线程和线程池的使用,你真的清楚了吗?

    Java的多线程和线程池的使用 多线程大大提高程序运行效率,我们在开发过程中经常会开启一个线程来执行一些费时的任务.开启一个线程有4种方式,在下面的文章我将详细的去讲解. 继承Thread 继承Thr ...

最新文章

  1. C# Job System
  2. 反射封装工具类-----零SQL插入
  3. 【实战 Ids4】║ 给授权服务器加个锁——HTTPS配置
  4. HTTP 和 HTTPS 协议
  5. 一个html中同时引入js和ts,《使用require在ts里引入js》
  6. 使用SQL Server日志传送将SQL数据库移动到其他服务器
  7. 《机电传动大作业》笔记一
  8. C3D行为识别(一):UCF101视频数据集预处理
  9. 2022企业邮箱登陆入口介绍,企业邮箱电脑版登陆入口有哪些?手机如何登陆企业邮箱?
  10. 【联想启天M4350】Windows 7下安装Yosemite 10.10.1懒人版
  11. word怎么删除不要的页,即刻删除空白页
  12. 循环结构--while循环
  13. 计算机公式除,Excel公式除法怎么用?教你四种使用方法
  14. pt100铂电阻的原理及用法
  15. NFS挂载失败: bad option; for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.
  16. pcb元器件焊接技巧
  17. 来了 来了 他真的来了
  18. Java基础语法,函数的定义与调用(比较两个数的大小)
  19. BGP(Border Gatreway Protcol)边界网关路由协议
  20. 再读图灵奖得主Brooks 没有银弹 什么是卓越的设计者

热门文章

  1. .NET短信接口验证
  2. 搜索+回溯问题(DFS\BFS详解)
  3. leetcode三道shell题
  4. leetcode28. 实现 strStr()
  5. 你的代码是否按照高内聚、低耦合的原则来设计的?
  6. 苹果支付:如何解决沙盒环境下获取可恢复购买项为空
  7. (八)nodejs循序渐进-事件驱动(进阶篇)
  8. ThinkPHP redirect 页面重定向使用详解与实例
  9. mysql数据库老是被锁怎么解决_Mysql数据库全局锁是如何引起的,如何解决?
  10. C语言的整型溢出问题