当前位置: 首页 > news >正文

py 的 第 33 天

1。今天讲了一下线程安全的问题   线程安全的有,列表,字典,队列(队列在后面生产者消费者模型里有)

2.锁,最普通的锁    lock

import threading
import time

v = []
lock = threading.Lock()

def func(arg):
    lock.acquire()        #这个只能锁一次,如果锁两次及以上就会锁死
    v.append(arg)
    time.sleep(0.01)
    m = v[-1]
    print(arg,m)
    lock.release()     #这个正常解锁一次就OK了,上边锁多了,下面怎么也解不开


for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()

 3,锁,用的最多的锁 Rlock

import threading
import time

v = []
lock = threading.RLock()
def func(arg):
    lock.acquire()   #这个可以锁2次       及以上
    lock.acquire()

    v.append(arg)
    time.sleep(0.01)
    m = v[-1]
    print(arg,m)

    lock.release()#上面锁几次这就解几次
    lock.release()


for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()                

 4,锁,名字最长的锁

import time
import threading

lock = threading.BoundedSemaphore(3)  #你这里写多少,他就一次走几个线程
def func(arg):
    lock.acquire()
    print(arg)
    time.sleep(1)
    lock.release()


for i in range(20):
    t =threading.Thread(target=func,args=(i,))
    t.start()

 5.锁,

import time
import threading

lock = threading.Condition()

# ############## 方式一 ##############

def func(arg):
    print('线程进来了')
    lock.acquire()   #这个锁还是必加的
    lock.wait() # 加锁     这里新加的锁,在多写一个主线程

    print(arg)
    time.sleep(1)

    lock.release()  #同上


for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()

while True:
    inp = int(input('>>>'))    #一次输入多少就执行多少线程

    lock.acquire()   #同上
    lock.notify(inp)  #固定写法
    lock.release()   #同上


# ############## 方式二 ##############
"""
def xxxx():
    print('来执行函数了')
    input(">>>")     #这个智能一点,在这里可以等到执行一个with open  等。。。然后才返回值,返回什么还可以再随机
    # ct = threading.current_thread() # 获取当前线程
    # ct.getName()
    return True

def func(arg):
    print('线程进来了')
    lock.wait_for(xxxx)    #一直在等,等某个条件满足了,就往下走
    print(arg)
    time.sleep(1)

for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()

6,锁,

import time
import threading

lock = threading.Event()


def func(arg):
    print('线程来了')
    lock.wait() # 加锁:红灯
    print(arg)


for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()

input(">>>>")
lock.set() # 绿灯      只要没有绿灯就一直锁死,只要绿灯过一次
lock.wait()  #只要绿灯过一次,这里再写几个也没用,只有clear有用

lock.clear() # 再次变红灯

for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()

input(">>>>")
lock.set()

 7.  threading.local()

import time
import threading

v = threading.local()

def func(arg):
    # 内部会为当前线程创建一个空间用于存储:phone=自己的值
     会为每一个线程储存一个空间
    v.phone = arg
    time.sleep(2)
    print(v.phone,arg) # 去当前线程自己空间取值    这两个值一样

for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()    

8.threadinglocal原理 

import time
import threading

DATA_DICT = {}

def func(arg):
    ident = threading.get_ident() 获取当前线程ID #c= threading.current_thread()  获取当前线程对象
    DATA_DICT[ident] = arg
    time.sleep(1)
    print(DATA_DICT[ident],arg)


for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()

 9.threadinglocal为每个线程维护一个空间(字典),用于当前线程存取自己的值,保证线程之间的数据隔离 {线程id:{自己的key:自己的value}}

import time
import threading
INFO = {}
class Local(object):

    def __getattr__(self, item):
        ident = threading.get_ident()
        return INFO[ident][item]

    def __setattr__(self, key, value):
        ident = threading.get_ident()
        if ident in INFO:
            INFO[ident][key] = value
        else:
            INFO[ident] = {key:value}

obj = Local()

def func(arg):
    obj.phone = arg # 调用对象的 __setattr__方法(“phone”,1)
    time.sleep(2)
    print(obj.phone,arg)


for i in range(10):
    t =threading.Thread(target=func,args=(i,))
    t.start()



每个对象都是调用上面的方法
def __getitem__(self,item)
obj['x']
def __getattr__(self,item)
obj.x  执行了他就等于执行attr x=item
def __setattr__(self,key,value):
obj.x=6    这个key是x value是6

 10.小数据池

from concurrent.futures import ThreadPoolExecutor
import time

def task(a1,a2):
    time.sleep(2)
    print(a1,a2)

# 创建了一个线程池(最多5个线程)
pool = ThreadPoolExecutor(5)

for i in range(40):
    # 去线程池中申请一个线程,让线程执行task函数。
    pool.submit(task,i,8)         




for i in range(10):    同比这个来讲的话     下面的对象这个要等于一下,arsg传值,上面的 一个submit就全搞定了
    t =threading.Thread(target=func,args=(i,))
    t.start()

 11.生产者消费者模型

用户是生产者,程序是消费者        生产者把东西放在这里,客户端接收到了就去工作

解决了一直等待的问题,让客服端和服务端不用直接交互,放在队列里互相等待

 

转载于:https://www.cnblogs.com/Mrszhao/p/9641507.html

相关文章:

  • [Vue CLI 3] 配置解析之 css.extract
  • 如何实现360度的手游安全防护?网易云易盾专家分享最新实践
  • 读入优化摸板
  • 有用的生活有关的website
  • 安卓学习阶段的回顾整理
  • ACM-ICPC 2018 焦作赛区网络预赛 A Magic Mirror(签到)
  • Python - 闭包Closure
  • 什么是注入点
  • 网易云易盾关于极验所述问题的致歉和说明
  • workflow的简介
  • Navicat Premium
  • 在python中安装basemap
  • 开拓创新,这才是该做的事情
  • 区块链技术,存在即合理,躺着就赚钱?
  • ppwjs之bootstrap文字排版:abbr元素 -- 创建缩写元素 和 到缩写元素
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 30天自制操作系统-2
  • css属性的继承、初识值、计算值、当前值、应用值
  • Docker容器管理
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • HTML5新特性总结
  • IP路由与转发
  • js写一个简单的选项卡
  • mongo索引构建
  • nodejs调试方法
  • node学习系列之简单文件上传
  • React-生命周期杂记
  • V4L2视频输入框架概述
  • Vue2.0 实现互斥
  • 给第三方使用接口的 URL 签名实现
  • 事件委托的小应用
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • #14vue3生成表单并跳转到外部地址的方式
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (力扣题库)跳跃游戏II(c++)
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (转)ORM
  • (转)Scala的“=”符号简介
  • *Django中的Ajax 纯js的书写样式1
  • .net core 6 redis操作类
  • .net反混淆脱壳工具de4dot的使用
  • .Net环境下的缓存技术介绍
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • /bin/rm: 参数列表过长"的解决办法
  • @Async注解的坑,小心
  • @Autowired标签与 @Resource标签 的区别
  • @Bean, @Component, @Configuration简析
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @RequestBody的使用
  • @selector(..)警告提示
  • @取消转义
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [<死锁专题>]