多线程锁,线程池,消费者生产者模型

 

 

锁是怎么存在的?

在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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2022】多线程并发编程面试真题

文章目录4. 多线程4.1 创建线程有哪几种方式?4.2 说说Thread类的常用方法4.3 run()和start()有什么区别?4.4 线程是否可以重复启动,会有什么后果?4.5 介绍一下线程的生命周期4.6 如何实现线程同步?4.7 说一说Java多线程…

苹果面试8大难题及答案

摘要:苹果这样的公司通常会在面试过程中向求职者抛出一些逻辑的问题来考研面试者,所以,如果你对进入苹果感兴趣,或者向往类似的公司,又或者只是对逻辑问题感兴趣,这些面试难题值得你仔细研究。 导读&#x…

idea自动导入jar包的快捷键

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 见:http://blog.csdn.net/u014771464/article/details/52330254 altenter(光标紧跟在类的后面)

ROS系统玩转自主移动机器人(3)-- 开源机器人结构介绍

ROS系统玩转自主移动机器人(3)-- 开源机器人结构介绍 本机器人机械结构设计相关的所有设计文件下载地址为:传送门 其中包含:三维造型设计文件(所有零件装配效果)(tips:基于Solidwork…

【2022】JVM常见面试真题详解

文章目录5. JVM5.1 JVM包含哪几部分?5.2 JVM是如何运行的?5.3 Java程序是怎么运行的?5.4 本地方法栈有什么用?5.5 没有程序计数器会怎么样?5.6 说一说Java的内存分布情况5.7 类存放在哪里?5.8 局部变量存放…

Linux 基本操作--文件查看 (day3)

一、查看文件-----cat (详情参考:http://blog.sina.com.cn/s/blog_52f6ead0010127xm.html) 语法结构: cat 查看方式 文件 cat -A : show all 显示所有内容,相当于-vET [rootlocalhost tmp]# cat -A /etc/profile #注释:查看/erx/目录下profile文件的内容 cat -b  :对非空…

如何在面试时写出高质量的代码

摘要:有些程序员由于平时没有养成良好的编程习惯,在面试时写出的代码质量不高,最终遗憾地与心仪的公司和职位失之交臂。如何在面试时能写出高质量的代码,是很多程序员关心的问题。 程序员在职业生涯中难免要接受编程面试。有些程序…

IntelliJ IDEA添加jar包

见:http://blog.csdn.net/a153375250/article/details/50851049 以JDBC-MySQL驱动包为例 1、在IntelliJ IDEA中打开要添加jar包的Project 2、File – Project Structure如下图 3、选择Moudules – 再选择Dependencies如下图 4、选中Moudule source – 然后点击2处号…

Python3 与 C# 并发编程之~ 进程篇

上次说了很多Linux下进程相关知识,这边不再复述,下面来说说Python的并发编程,如有错误欢迎提出~ 如果遇到听不懂的可以看上一次的文章:https://www.cnblogs.com/dotnetcrazy/p/9363810.html 官方文档:https…

11月12号 用户登录输入密码错误达到指定次数后,锁定账户 004

用户表里添加两个属性 连续密码输错次数private Integer loginFailCount;/** 登录失败禁用时间 */ private Date missDate; / 如果登录错误次数大于5次 规定时间内禁止登录if(dbUser.getLoginFailCount() ! null && dbUser.getLoginFailCount() > 3){if(DateUtils.…

Goobuntu:谷歌的内部桌面系统

摘要:大多数Linux用户都知道Google用Linux作为它们的桌面和服务器端操作系统,有的人可能还知道Google选择的是定制的Ubuntu——Goobuntu,但在此之前几乎没有Google外部人员了解他们究竟是如何使用Ubuntu的,8月29日,Tho…

Springboot 之 Hibernate自动建表(Mysql)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 引入Maven依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-…

Spring全家桶面试真题

文章目录1. Spring Boot1.1 说说你对Spring Boot的理解1.2 Spring Boot Starter有什么用&#xff1f;1.3 介绍Spring Boot的启动流程1.4 Spring Boot项目是如何导入包的&#xff1f;1.5 请描述Spring Boot自动装配的过程1.6 说说你对Spring Boot注解的了解2. Spring2.1 请你说说…

WSDL测试webservice接口记录

收到一个事情&#xff0c;需要对接第三方API&#xff0c;对方给了个service&#xff0c;看了一下&#xff0c;原来是webservices的。 上一次测试webervice的接口&#xff0c;还是至少八九年前的时候了&#xff0c;这种相对比较老旧的也好久不在使用。 于是&#xff0c;简单搞了…

idea窗口下方滚动条不明显设置

在使用idea时&#xff0c;下方的滚动条老是显示不明显&#xff0c;每次点击拖拽都很费劲&#xff0c;在网上找了很多相关设置&#xff0c;最后确定了一个最好的办法解决问题&#xff1a; Shift &#xff08;上档&#xff09; 鼠标滚动&#xff0c;这样就可以横向翻滚了&#…

把握本质规律——《数学之美》作者吴军

无论是互联网&#xff0c;还是手机、电视&#xff0c;现代通信都遵循信息论的规律&#xff0c;整个信息论的基础都是数学。搜索引擎、语音识别、机器翻译也都是我们生活中离不开的技术&#xff0c;数学也是解决这些问题的最好工具。在《浪潮之巅》出版后&#xff0c;吴军将蕴含…

Hibernate4 注解方法说明

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1.类级别注解 Entity 映射实体类 Table 映射数句库表 Entity(name"tableName") - 必须&#xff0c;注解将一个类声明…

消息队列常见面试题

文章目录2. 消息队列2.1 MQ有什么用&#xff1f;2.2 说一说生产者与消费者模式2.3 消息队列如何保证顺序消费&#xff1f;2.4 消息队列如何保证消息不丢&#xff1f;2.5 消息队列如何保证不重复消费&#xff1f;2.6 MQ处理消息失败了怎么办&#xff1f;2.7 请介绍消息队列推和拉…

Mybatis 详解--- 一级缓存、二级缓存

2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存&#xff0c;可以通过下图来理解&#xff1a; ①、一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象&#xff0c;在对象中有一个数据结构&#xff08;Hash…

我的nabcd

我们组要做的软件是一款MP3播放软件&#xff0c;名字叫TDG音乐 N&#xff08;need需求&#xff09;&#xff0c;由于现在版权越来越被重视&#xff0c;许多播放软件里面的大部分歌曲都是收费的&#xff0c;不想花钱又想听可怎么办呢&#xff0c;只能在网上找免费资源&#xff0…