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

智能推荐

微信小程序Code怎么获取_wx.login获取code_乐编小易的博客-程序员秘密

1.官方开发文档 wx.login 可以获取code2.微信PC端内存HOOK获取小程序Code3.抓PC包{微信小程序基本都是基于HTTPS的,在开发调试小程序时,普通的抓包软件是抓不到的,所以我们想要抓包首先需要配置证书 SSL推荐软件 fiddler 或 Charles1.fiddler配置抓取Https包1.下载最新版fiddler2.下载并安装Fiddler证书生成器3打开Fiddler,点击工具栏中的Tools—>Options4.点击https设置选项,勾选选择项5

程序员应该知道的操作系统知识--基础篇(三)_程序员操作系统基础知识_赤耳小永的博客-程序员秘密

程序员应该知道的操作系统基础知识在多线程并发环境下,经常出现一些意想不到的错误,例如数值的累加,错的原因可能涉及到计算机原理以及JAVA方面的一些知识。下面我们就先从CPU的多级缓存开始说起;CPU缓存缓存存在的意义:CPU缓存存在的意义分两点(局部性原理):时间局部性:如果某个数据被访问,那么在不久的将来它很可能被再次访问。空间局限性:如果某个数据被访问,那么与它相邻的数据很快也可能被访问。我们先来认识一下整体结构,看一张图片,如下:CPU Core : CPU核心Cache :

关于ThreadPool.RegisterWaitForSingleObject和WaitHandle的应用介绍_mlzboy的博客-程序员秘密

 最近在学习线程相关的内容,所以把学习过程中的心得记录下来,相信大家常用            ThreadPool.QueueUserWorkItem()或者Thread thd=new Thread(new ThreadStart(test)))但是应该很少人知道用ThreadPool.RegisterWaitForSingleObject(高手除外啦),我也是最近才知道。让我来给各位看官解...

小白都能看懂的java虚拟机内存区域划分_土豆是我的最爱的博客-程序员秘密

目录一、虚拟机二、虚拟机组成1.栈栈帧2.程序计数器3.方法区对象组成4.本地方法栈5.堆GCGC案例一、虚拟机​同样的java代码在不同平台生成的机器码肯定是不一样的,因为不同的操作系统底层的硬件指令集是不同的。同一个java代码在windows上生成的机器码可能是0101.......,在linux上生成的可能是1100.......

DEDECMS不调用指定栏目或隐藏栏目下的文章_平哥SEO的博客-程序员秘密

在织梦DEDECMS建站过程中,调用全站的最新文章时,程序会自动调用网站中所有已发布的文档,如果我们不想调用某个栏目下的文章时,应该如何操作呢?下面讲一下如何让DEDECMS不调用指定栏目下的文章的方法。设置DEDE屏蔽某个栏目的方法首先把不需要调用的栏目设置为“隐藏”;用FTP软件打开自己网站的空间,找到以下文件:/include/taglib/arclist

ADO.NET的最佳实践技巧[引用]_weixin_34175509的博客-程序员秘密

简介本文为您提供了在 Microsoft ADO.NET 应用程序中实现和获得最佳性能、可伸缩性以及功能的最佳解决方案;同时也讲述了使用 ADO.NET 中可用对象的最佳实践;并提出一些有助于优化 ADO.NET 应用程序设计的建议。本文包含: • 有关 .NET 框架包含...

随便推点

软件熵(Software entropy)_Lambda程序员的博客-程序员秘密

软件熵(Software entropy)是指软件的无序程度。软件熵可用来说明软件在经过不断修改后,无序程度提高的现象。尽管软件开发几乎不受任何物理定律的约束,熵(entropy)对我们的影响却很大。熵是一个来自物理学的概念,指的是某个系统中的 “无序” 的总量,遗憾的是,热力学定律保证了宇宙中的熵倾向于最大化,当软件中的无序增长时,程序员们称之为 “软件腐烂(softwar...

华为mate30 完全卸载google套件_华为手机google怎么卸载_SpongeZhuang的博客-程序员秘密

华为mate30可以成功安装google服务,但是需要认证机型。一般都是会失败的,即使偶尔会成功,果断时间也会失效,估计是google的封杀吧清除google服务,不需要重制手机,用adb也可以完全卸载;删除google 部分服务Google play service1 adb uninstall com.google.android.gmsGoogle Play Store2.ad...

chrome跨域_谷歌跨域_尜尜alp的博客-程序员秘密

降低chrome浏览器安全性,可以让其实现跨域,在环境变量后面添加这一句就可以实现:--args --disable-web-security

JPA快速入门,包括ORM的概述以及对JPA和hibernate的简介,搭建JPA的入门案例、增删查改、复杂查询等操作。_coderxz的博客-程序员秘密

文章目录ORM的概述JAP的概述JAP与hibernate的关系JPA入门案例的搭建JPA中的API介绍JPA中的增删查改JPA中的复杂查询maven坐标ORM的概述ORM(Object-Relational Mapping)表示对象关系映射。基于面向对象的思想,将对象与关系型数据库进行映射。简单而言,ORM就是建立实体类和数据库表之间的关系,从而达到操作实体类就相当于操作数据库表的目的。...

线性不可分到线性可分--低维空间映射到高维空间_weixin_30670965的博客-程序员秘密

二维平面上的点无法用一条直线分开,可以将其按照一定规则映射到三维空间中,用超平面将其分开 转载于:https://www.cnblogs.com/yan456jie/p/5369522.html...

如何参与开源_milk_and_bread的博客-程序员秘密

入手查找issue选择label:“start:contributions welcome”issue说明提出PR(Pull Respose)遵守规范

推荐文章

热门文章

相关标签