python--线程锁,队列
#线程数据安全处理--同步锁
import time
def sub():
global num print("ok")
lock.acquire()#获取这把锁--->只有一个线程被执行,不允许cpu切换,必须执行完这个线程 trmp=num
time.sleep(0.01)###串行处理
num=trmp-1
print(num)
lock.release()#释放这把锁 num=100 import threading l=[] lock=threading.Lock()#线程锁 for i in range(100):
t=threading.Thread(target=sub)
l.append(t)
t.start() for t in l:
t.join() print(num)
#递归锁
import threading,time #递归锁 class Mythread(threading.Thread): def actionA(self):
R_LOCK.acquire()#count=1
print(self.name,"gotA",time.ctime())
time.sleep(2) R_LOCK.acquire()#count=2
print(self.name, "gotB", time.ctime())
time.sleep(1) R_LOCK.release()#count=1
R_LOCK.release()#count=0 def actionB(self):
R_LOCK.acquire()
print(self.name, "gotB", time.ctime())
time.sleep(2) R_LOCK.acquire()
print(self.name, "gotA", time.ctime())
time.sleep(1) R_LOCK.release()
R_LOCK.release() def run(self):
self.actionA()
self.actionB() if __name__=="__main__":
# A=threading.Lock()
# B=threading.Lock()
R_LOCK=threading.RLock()#递归锁 l=[]
for i in range(5):
t=Mythread()
t.start()
l.append(t) for i in l:
i.join() print("ending")
#队列,线程间数据的安全
import queue #线程 队列 #默认先进先出-->FIFO 队列用于解决线程安全,线程通信 q=queue.Queue(3)#存放参数数据限制
q.put(12)
q.put("")
q.put({"name":"alex"})#放入数据,数据已满时阻塞
print(q.qsize())#队列存储大小
print(q.empty())#是否为空
print(q.full())#是否已满 # q.put(22,False)当put的参数超过指定存放的参数时报错 while 1:
data=q.get()#获取数据,数据为空时等待,阻塞
print(data)
print("----------------") #---先进后出,后进先出 # import queue
#
# q=queue.LifoQueue()
# q.put(12)
# q.put("hello")
# q.put({"name":"yuan"})
#
# while True:
# data=q.get()
# print(data)
# print("-------------------") #数字优先级
# import queue
#
# q=queue.PriorityQueue()
# q.put([1,12])
# q.put([2,"hello"])
# q.put([4,{"name":"yuan"}])
#
# while True:
# data=q.get()
# print(data[1])
# print("-------------------")
#
#生产者消费者模型
import time,random
import queue,threading q=queue.Queue()#线程共用全局队列q def Producer(name):
count=0
while count<10:
print("making")
# time.sleep(5)
q.put(count)
print("Producer %s has product %s baozi"%(name,count))
count+=1
# q.task_done()#告诉队列数据已经发送或获取
q.join()
print("ok") def Consumer(name):
count=0
while count<10:
time.sleep(random.randrange(4))
print("waitting")
# if not q.empty():
# q.join()#q.join 接受q.task_done的信号,如果没有发送,join则阻塞
data=q.get()
time.sleep(4)
q.task_done()
# print(data)
print("Consumer %s has eat %s baozi "%(name,data))
# else:
# print("包子不够了")
count +=1 p1=threading.Thread(target=Producer,args=('A军',))
p2=threading.Thread(target=Consumer,args=("B君",))
c3=threading.Thread(target=Consumer,args=("C君",))
c4=threading.Thread(target=Consumer,args=("D君",)) p1.start()
p2.start()
c3.start()
c4.start()
python--线程锁,队列的更多相关文章
- python线程,进程,队列和缓存
一.线程 threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 创建线程的两种方式1.threading.Thread import threading def f1(arg): ...
- python线程锁
import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...
- Python线程优先级队列(Queue)
Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue.这些队列都实 ...
- [python] 线程锁
参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...
- python之锁, 队列
进程的其他方法 进程id,进程名字,查看进程是否活着is_alive() terminate()发送结束进程的信号 import time import os from multiprocessin ...
- python之网络编程--锁、信号量、线程、队列
一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...
- 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型
一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- day9---多线程,线程锁,队列
进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...
- python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)
python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...
随机推荐
- 「PKUSC 2018」真实排名
题目链接 戳我 \(Solution\) 我们将现在所要进行的数设为\(now\) 我们分情况讨论一下 他自己不翻倍 他自己翻倍 我们首先来看看\(1\)操作 如果要满足他对排名没有影响,那么不能进行 ...
- 2018年5月6日GDCPC(广东赛区)总结
大二第二次参加省赛了,这次成绩不是太理想. ———————————————————————————————— day1:试机 约好的12点钟在地铁站集合,好像就我一个人迟到了5分钟,被sen主席批判一 ...
- a标签点击,页面自动刷新
<a href="javascript:void(0)" id="reDiagnosis" class="checkBtn"oncli ...
- 一、Robotframework安装步骤
1.安装python并验证安装成功 a.安装python-2.7.14.amd64------默认路径安装即可 b.添加环境变量path:C:\Python27; C:\Python27\Script ...
- MySQL——索引
MySQL索引的概念 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,通俗来讲索引就好比书本的目录,加快数据库的查询速度. 举个简单的例子,见下图: 注意:此例 ...
- 测开之路一百五十五:jquery-validation前台数据验证
前面做的wtform验证是服务器端的验证,需要把数据传输到服务器,服务器验证后再吧结果传输到前端,网络慢的时候,用户体验不好,所以需要前端验证,且后端验证不能少 传统的js或者jquery如果要验证信 ...
- Maven使用WEB-INF/lib下面的jar编译和打包
在某些情况下,maven无法下载依赖的jar,或者依赖的m2会非常的大,上G那是随随便便的事.为了方便修改和编译,在打出的war包基础上,或者直接把tomcat的webapps下的项目拿出来,就可以用 ...
- FiddlerCore修改http返回结果
static void FiddlerApplication_BeforeRequest(Session oSession) { oSession.bBufferResponse = true; } ...
- sentos7网卡改名
一.已经装好系统CentOS7修改网卡为eth0 1. 修改网卡配置文件[root@localhost ~]# mv /etc/sysconfig/network-scripts/ifcfg-ens3 ...
- ESXi导出的CentOS7 ovf文件导入到workstation 无法打开GUI登录界面的问题解决方案
1. 前几天将centos的机器导出为ovf 文件 然后使用 workstation 引入之后发现总是黑屏 然后有一个 横杠在闪 2. 解决办法是 修改centos的虚拟机配置文件,将显示器修改为这样 ...