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())
Python 之并发编程之线程下的更多相关文章
- Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)
八:事件(Event()) # 阻塞事件: e = Event() 生成事件对象e e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...
- python 之 并发编程(线程Event、协程)
9.14 线程Event connect线程执行到event.wait()时开始等待,直到check线程执行event.set()后立即继续线程connect from threading impor ...
- Python 之并发编程之线程上
一.线程概念 进程是资源分配的最小单位 线程是计算机中调度的最小单位 多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都 ...
- Python 之并发编程之线程中
四.线程锁lock(线程的数据安全) 在数据量较大的时候,线程中的数据会被并发,所有数据会不同步,以至于数据会异常. 下面还介绍了两种的上锁方法. 例: from threading import T ...
- python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)
9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...
- 《转载》Python并发编程之线程池/进程池--concurrent.futures模块
本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...
- python并发编程之线程/协程
python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...
- Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析
王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...
- Python 3 并发编程多进程之队列(推荐使用)
Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...
随机推荐
- Redis01——Redis介绍
1.NoSQL数据库概述 NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库. NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式 ...
- 推荐几个c/c++语言编写的游戏源码下载网站
在游戏开发的学习或工作中,利用完好的游戏源码可以事半功倍,不仅可以逆向学习开拓思维,也可以大大减少设计周期.自己浏览了很游戏源码下载的网站,发现大多数质量都良莠不齐,且大部分需要消费才能下载,下面整理 ...
- 【Python】爬虫原理
前言 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前: 一.爬虫是什 ...
- LA 2995 立方体成像(模拟)
题目链接:https://vjudge.net/problem/UVALive-2995 这道题的主要难点在于三维坐标系的建立,然后在坐标系中进行迭代更新. 注意用宏定义来简化代码. AC代码: #i ...
- C:函数 注意点
形参 在定义函数时指定的形参,在未出现函数调用时,它们并不占内存中的存储单元,因此称它们是形式参数或虚拟参数,简称形参,表示它们并不是实际存在的数据,所以,形参里的变量不能赋值. C不像C++里一样可 ...
- NTP服务安装及时间同步
1.安装ntp服务命令 yum install -y ntp 2.常用NTP服务器地址: ntp1.aliyun.com ntp2.aliyun.com ntp3.aliyun.com ntp4.al ...
- Node.js Learning Notes
简介 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事件驱动I/O服务 ...
- linux创建用户组、用户
创建用户组 groupadd -g 1024 nameinfo 创建用户 首先创建目录 mkdir -p /home 创建用户 useradd -g nameinfo -u 1024 -d /home ...
- Tomcat部署Web项目的3种方式
一.将war包丢进webapps 这是最简单粗暴的方式:将web工程打成war,丢进tomcat/webapps目录即可,tomcat会自动解压.无需修改任何配置文件即可完成部署. 这里我准备了tom ...
- python二维数组的创建
话不多说,代码伺候 m = [[]*]*3 #创建一个3行5列的二维数组 m[][]= print(m) 输出结果为: 分析: m = [[0]*5]*3只是指向三个空列表的引用. 创建一个二维数组的 ...