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

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. Oracle dba角色和sysdba的区别

    如果用户需要远程sysdba的方式登陆,需要grant sysdba权限,登陆后以sys用户执行命令,需要验证密码文件. 密码文件如果是从12c之前的老版本同步过来,需要重建12c格式的密码文件. d ...

  2. Array Stack Implement using C

  3. 在docker容器中调用docker命令

    宿主容器均为CentOS7.6.1810 docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/run/docker.s ...

  4. React Router学习笔记(转自阮一峰老师博客)

    React Router是一个路由库,通过管理URL来实现组件切换和状态转变. 1.安装和使用 $ npm install -S react-router 在使用时,作为React组件导入 impor ...

  5. JS数组方法的的返回值和是否改变该数组总结

    concat() 方法 concat() 方法用于连接两个或多个数组. 该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 返回值 返回一个新的数组.该数组是通过把所有 arrayX 参数添 ...

  6. Docker安装CentOS7

    1. 拉取镜像 docker pull centos:centos7 2. 启动镜像创建容器 docker run -d -p 36622:22 -p 36680:80 --name centos7- ...

  7. C# 创建和引入动态链接库dll文件

    一.创建动态链接库dll文件 新建 -> 项目->类库 名称为:dlltest 添加函数:消息框弹出消息 using System.Collections.Generic; using S ...

  8. 那些年我们经历的BT面试题

    初入职场面试的我到处碰壁,以下是我个人对几道面试题的小总结: 1.一列数字的规则如下:1,1,2,3,5,8,13,21, 34........ 求第30位数字是多少,用递规和非递归两种方法算法实现. ...

  9. php7.2 下安装yaf扩展

    wget http://pecl.php.net/get/yaf-3.0.7.tgz  解压并进入目录: 1 tar -zxvf yaf-3.0.7* && cd yaf-3.0.7  ...

  10. Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图

    三维绘图函数 三维绘制工具 函数view 实例:三维螺旋线 >> t=:pi/:*pi; plot3(sin(t),cos(t),t) grid %添加网格  plot3可以画出空间中的曲 ...