Python 之并发编程之线程下_baijin20100228的博客-程序员秘密

技术标签: python  数据结构与算法  数据库  

.线程局部变量

多线程之间使用threading.local 对象用来存储数据,而其他线程不可见

实现多线程之间的数据隔离

本质上就是不同的线程使用这个对象时,为其创建一个只属于当前线程的字典

拿空间换时间的方法

例:

from threading import local, Thread

 

loc = local()

print(loc)  # 是个对象

 

 

def func(name, age):

    global loc

    loc.name = name

    loc.age = age

    print(loc.name, loc.age)

 

 

# 创建第一个线程

t1 = Thread(target=func, args=("one", 98))

t1.start()

 

# 创建第二个线程

t2 = Thread(target=func, args=("two", 19))

t2.start()

 

.线程事件

例:

from threading import Event,Thread

import time,random

 

'''

# wait()  动态添加阻塞

#set()    将内部属性改为True

#clear()  将内部属性改成False

#is_set() 判断当前属性(默认为False)

 

语法:

e = Event()

print(e.is_set())

# wait(timeout = 3) 最多阻塞等待3

e.wait(3)

print(e.is_set())

'''

 

def check(e):

    print("开始检测数据连接的合法性")

    time.sleep(random.randrange(1,7))

    e.set()

 

def connect(e):

    sign = False

    # 最多尝试连接3次数据库,连接不上就报错,报错时等待错误,TimeoutError

    for i in range(3):

        e.wait(1)

        if e.is_set():

            sign = True

            print("数据库连接成功")

            break

        else:

            print("尝试连接数据库%s次失败" % (i+1))

 

    if sign ==False:

        # 主动抛出异常

        raise TimeoutError

 

e = Event()

# 创建线程1

Thread(target=check,args=(e,)).start()

 

#创建线程2

Thread(target=connect,args=(e,)).start()

.条件

例:

 

from threading import Condition, Thread

import time

 

'''

wait notify 是一对

    wait 负责添加阻塞

    notify 负责释放阻塞

    语法: 无论是wait 还是notify ,在使用时,前后必须上锁

    

#(1) 语法: wait 前后上锁

acquire()

wait()

..code..

release()

 

#(2) 语法:notify 前后上锁

acquire()

notify(自定义释放多少阻塞,释放多少线程数量,默认放下1)

release()

 

'''

def func(con,index):

    print("%s在等待" % (index))

    con.acquire()

    # 添加阻塞

    con.wait()

    print("%s do something" % (index))

    con.release()

 

con = Condition()

for i in range(10):

    t = Thread(target=func,args=(con,i))

    t.start()

 

time.sleep(1)

# 写法一

con.acquire()

 

#一次性释放所有阻塞,所有线程

#con.notifyAll()

con.notify(10)

con.release()

 

#写法二

# count = 10

# while count>0:

# num = int(input(">>>\n"))

# con.acquire()

# con.notify(num)

# con.release()

# count-=num

 

十.定时器

# Timer 几秒之后执行某个任务

from threading import Timer

def func():

    print("正在执行某任务。。。")

 

# Timer(时间,执行的任务)

t = Timer(3,func)

t.start()

print("主线程...")

 

# 在实际生产中,利用linux的计划任务来取代 , crontab 来取代

 

十一.队列

import queue

# from queue import Queue

"""

put     往队列里放值,超过队列长度,直接阻塞

get     获取值,如果获取不到,阻塞

put_nowait()    如果放入的值超过了,队列长度,直接报错

get_nowait()    如果获取的值已经没有了,直接报错

 

"""

# (1)queue 先进先出

'''

q = queue.Queue()

q.put(1)

q.put(2)

print(q.get())

#print(q.get())

#print(q.get()) #值不够取,产生阻塞

# 线程中支持get_nowait

print(q.get_nowait())

'''

 

# 可以限制队列的长度

'''

q = queue.Queue(2)

q.put(3)

q.put(4)

#q.put(5)  #发生阻塞

q.put_nowait(6)   # 报错: queue.Full

 

'''

 

# (2) lifoQueue 后进先出(数据结构中,栈队列的存取顺序)

'''

from queue import LifoQueue

lq = LifoQueue()

lq.put(1)

lq.put(2)

print(lq.get())

 

'''

 

# (3) PriorityQueue 按照优先顺序排序

from queue import  PriorityQueue

'''

默认按照数字大小排序,然后再按照ascii编码排序

'''

pq = PriorityQueue()

pq.put( (12,"zhangsan")  )

pq.put( (6, "lisi" )     )

pq.put( (6,"lijiujiu")   )

pq.put( (18,"wangwu" )   )

print(pq.get())

print(pq.get())

print(pq.get())

print(pq.get())

 

# 单独一个元素,必须放同一种类型,

# (1)如果是数字 [默认从小到大排序]

pq = PriorityQueue()

pq.put(13)

pq.put(18)

pq.put(3)

# pq.put("abc")

 

print(pq.get())

print(pq.get())

print(pq.get())

# print(pq.get())

 

# (2) 如果是字符串 [默认按照ascii编码从小到大排序]

pq = PriorityQueue()

pq.put("aabb")

pq.put("ddbb")

pq.put("ccbb")

pq.put("王五")

pq.put("李四")

# pq.put(990) #error

print(pq.get())

print(pq.get())

print(pq.get())

转载于:https://www.cnblogs.com/hszstudypy/p/11222644.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baijin20100228/article/details/102108967

智能推荐

Java--方法递归调用_java递归调用_柳落青的博客-程序员秘密

方法递归调用1.什么是递归?*方法自身调用自身2.递归是很耗费栈内存的3.递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误4.以下程序运行的时候发生了一个错误【不是异常,是错误】栈内存溢出错误,错误发生无法挽回,只有一个结果,JVM停止工作public static void show(){ show();}5.递归即使有了结束条件,即使结束条件是正确的,也可能发生......

react鼠标移入移出样式修改_丶酸酸的博客-程序员秘密

解决react鼠标移入移出样式修改的问题。效果截图:代码实现:js代码:<div className={styles.listStyle}> <Menu onClick={this.listClick} style={{ width: '100%', height: '100%' }}

Unity3d C# UGUI实现一个自动循环滚动的列表(ScrollRect)的功能(含工程源码)_十幺卜入的博客-程序员秘密

目录前言效果实现搭建UI定义滚动方向初始化数值自动滚动工程源码注意横向竖向前言如题的功能在项目中经常用到,滚动的信息内容,我们用scrollbar的value来控制滚动是可以实现的,不过当value为1时,我们从0继续循环会造成有闪烁的情况而且比较突兀,经过一段时间的研究终于实现了该功能。效果分别方向的移动实现自动滚动的思路就是不断的增加某一个方向的偏移值就可以实现,循环滚动时,将最早移出的节点移至滚动队列的最尾端即可,同时计算新的偏移值并同步,让列表看不出抖动,即可实现一直循环滚动,在此

记录:python cv2窗口置顶_cv2置顶_sanitizer的博客-程序员秘密

参考:https://cloud.tencent.com/developer/article/1711584cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))ret, frame = cap.read()cv2.imshow("capture",frame)shell = win32com.client.Dispatch(

音乐制作软件中文版-Studio One 4.5.1 WiN-MAC_键盘f13~f24软件_Cloudmidi.net的博客-程序员秘密

Studio One 4 v4.5.1 WiN&macOS | 240MPreSonus宣布Studio Studio音序器的第四个主要更新版本。为了在PreSonus Studio One 4中创建草图,出现了一个新的“和弦轨道”工具,可以从音频或乐器轨道中自动识别和声,并将其导出到和弦序列以进行和声编辑。Impact鼓模块变成了Impact XT,增加了20个新功能,Sample One采样器变成了Sample One XT,现在您不仅可以采样任何...

2019全国计算机二级JAVA,2019年9月全国计算机等级考试(NCRE)[Java语言程序设计]复习题及答案..._邹志渭的博客-程序员秘密

&nbsp&nbsp[导读]:2019年9月全国计算机等级考试(NCRE)[Java语言程序设计]复习题及答案,更多全国等级考试报名时间、考试时间以及考试模拟试题,请访问易考吧全国等级考试栏目为了考生能够轻松备考2019年9月全国计算机等级考试(NCRE),易考吧全国等级考试栏目强力推出2019年计算机等级考试(二级Java语言程序设计)易考宝典软件[详情点击]《二级Java语言程...

随便推点

Linux之权限管理操作_兮动人的博客-程序员秘密

Linux的权限操作与用户、用户组是兄弟操作。一、权限概述总述:Linux系统一般将文件可存/取访问的身份分为3个类别:owner、group、others,且3种身份各有read、write、execute等权限。1、权限介绍什么是权限?在多用户(可以不同时)计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权力,像是文件夹、特定系统指令的使用或存储量的限制。在Linux中分别有读、写、执行权限:权限:对于文件夹来说,读权限影响用户是否能够列出目录结构对于文件来说.

Spring 1.x 到2.x,再到 3.x,最后SpringBoot_springboot 2.x 3.x_专注_每天进步一点点的博客-程序员秘密

一,Spring的发展1,Spring1.x时代在Spring1.x时代,都是通过xml文件配置bean,随着项目的不断扩大,需要将xml配置分放到不同的配置文件中,需要频繁的在java类和xml配置文件中切换。2,Spring2.x时代随着JDK1.5带来的注解支持,Spring2.x可以使用注解对Bean进行申明和注入,大大的减少了xml配置文件,同时也大大简化了项目的开发...

amos里CFA可行性辨别结果怎么看_AMOS 中验证性因素分析(CFA)_weixin_39597399的博客-程序员秘密

* 没有数据缺失时选用极大似然估计法(Maximum Likelihood Estimates)有数据确实时选用Full Information Maximum Likelihood (Arbuckle, Marcoulides, & Schumacker, 1996)验证性因素分析(Confirmatory Factor Analysis)EFA是简历量表或问卷的建构效度CFA是检验此建...

软件测试有效性指标,如何衡量软件测试的有效性?_小浪花VG的博客-程序员秘密

51Testing软件测试网hTi$~*mp6t"w~我经常被问到这个问题:“如何衡量的有效性?”或者是“如何评价测试的有效性?” 仿佛只要我说出个一二三来,听者根据这套规则,就可以得到一个结论:“我们的测试是否是有效的?”o^DGel7g051Testing软件测试网i/t n4~5X t(qU很多团队都会定义一些自己的规则,这些规则几乎包罗万象了,比如通过覆盖率的数据、比如通过bug的数量和趋...

洛谷 P5728 【深基5.例5】旗鼓相当的对手_c语言旗鼓相当的对手_Guan_qiqi的博客-程序员秘密

AC代码:#include<stdio.h>#include<math.h>int main(){ int n, flag=0; scanf("%d", &n); int a[n][3]; for(int i=0; i<n; i++){ //一个循环,输入三次,降低复杂度 scanf("%d", &a[i][0]);...

【Oracle】错误号参数超出范围,Oracle的自定义错误号到底有多少个_码婆Doph的博客-程序员秘密

【Oracle】错误号参数超出范围,Oracle的自定义错误号到底有多少个RAISE_APPLICATION_ERROR是我们经常在Oracle数据库的触发器中使用的内置函数。它有两个参数,一个是错误号,一个是错误提示信息。我们都知道错误信息可以自定义,那么错误号的范围到底是多少呢?答案是:20000-20999。也就是说甲骨文公司允许我们定义999个自定义错误类型。其实已经很多了。官方的错...

推荐文章

热门文章

相关标签