#线程数据安全处理--同步锁

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--线程锁,队列的更多相关文章

  1. python线程,进程,队列和缓存

    一.线程 threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 创建线程的两种方式1.threading.Thread import threading def f1(arg): ...

  2. python线程锁

    import time,threading balance = 0 lock = threading.Lock() def change_it(n): global balance balance = ...

  3. Python线程优先级队列(Queue)

    Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue.这些队列都实 ...

  4. [python] 线程锁

    参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...

  5. python之锁, 队列

    进程的其他方法 进程id,进程名字,查看进程是否活着is_alive()  terminate()发送结束进程的信号 import time import os from multiprocessin ...

  6. python之网络编程--锁、信号量、线程、队列

    一.线程,可以发现顺序执行比开线程执行时间要短.原因是,一个进程中的多线程处理,由于存在GIL,并且GIL中只能存在一个线程,加上线程又存在切换的问题,所以时间耗得多.想要解决这个问题,是开几个进程, ...

  7. 进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型

    一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: import param ...

  8. python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03

    目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...

  9. day9---多线程,线程锁,队列

    进程.线程 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述] Pyt ...

  10. python_way ,day11 线程,怎么写一个多线程?,队列,生产者消费者模型,线程锁,缓存(memcache,redis)

    python11 1.多线程原理 2.怎么写一个多线程? 3.队列 4.生产者消费者模型 5.线程锁 6.缓存 memcache redis 多线程原理 def f1(arg) print(arg) ...

随机推荐

  1. (转载)FM 算法

    (转载)FM算法 https://zhuanlan.zhihu.com/p/33184179

  2. jenkins不展示set Build Description Setter插件

    问题描述: 1.jenkins 已下载 set build descripteion ,并且配置过,可以在构建历史中展示就用二维码 2.问题:构建历史中不展示二维码了,如图: 总是排查: 1.首先想到 ...

  3. hibernate 配置+注释

    Hibernate配置属性 属性名 用途 hibernate.dialect 一个Hibernate Dialect类名允许Hibernate针对特定的关系数据库生成优化的SQL. 取值 full.c ...

  4. 自建 CA 中心并签发 CA 证书

    目录 文章目录 目录 CA 认证原理浅析 基本概念 PKI CA 认证中心(证书签发) X.509 标准 证书 证书的签发过程 自建 CA 签发证书并认证 HTTPS 网站的过程 使用 OpenSSL ...

  5. HTML真是好东西!

    HTML真是好东西! 学习HTML已经两天了,别小看这两天哦,这短短的两天估计要比学校的四周还要长.不仅有教学,还有同学与老师之间的交流,最重要的是自己上机实践的过程.在这个过程中,不仅知道了在HTM ...

  6. js实现上传文件实时显示缩略图

    <input name="coverImage" onClick="" onchange="setImagePreview(this);&quo ...

  7. 【Java安全】关于Java中常用加密/解密方法的实现

    安全问题已经成为一个越来越重要的问题,在Java中如何对重要数据进行加密解密是本文的主要内容. 一.常用的加密/解密算法 1.Base64 严格来说Base64并不是一种加密/解密算法,而是一种编码方 ...

  8. MySQL单列索引和组合索引的创建及区别介绍

    MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表 ...

  9. hibernate 2 一对多、多对一 双向映射

    多对一或一对多中,在多的一方维护关系效率高 一:java实体类 1.Classes.java package cn.gs.ly.school.entity; import java.util.Set; ...

  10. 批处理文件将多台连接的手机安装同一个APP

    :adb devices > C:\Users\aaminaxu\Desktop\a.txt :1.首先获取连接到电脑的手机的设备信息将其保存到C盘的a.txt文件中::2.将保存的txt文件中 ...