七.线程局部变量

多线程之间使用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 之并发编程之线程下的更多相关文章

  1. Python 之并发编程之进程下(事件(Event())、队列(Queue)、生产者与消费者模型、JoinableQueue)

    八:事件(Event()) # 阻塞事件:    e = Event() 生成事件对象e    e.wait() 动态给程序加阻塞,程序当中是否加阻塞完全取决于该对象中的is_set() [默认返回值 ...

  2. python 之 并发编程(线程Event、协程)

    9.14 线程Event connect线程执行到event.wait()时开始等待,直到check线程执行event.set()后立即继续线程connect from threading impor ...

  3. Python 之并发编程之线程上

    一.线程概念 进程是资源分配的最小单位 线程是计算机中调度的最小单位 多线程(即多个控制线程)的概念是,在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都 ...

  4. Python 之并发编程之线程中

    四.线程锁lock(线程的数据安全) 在数据量较大的时候,线程中的数据会被并发,所有数据会不同步,以至于数据会异常. 下面还介绍了两种的上锁方法. 例: from threading import T ...

  5. python 之 并发编程(线程理论,开启线程的两种方式,进程与线程的区别,线程对象的其他方法)

    9.9 线程理论 1.什么是线程 线程指的是一条流水线的工作过程 进程根本就不是一个执行单位,进程其实是一个资源单位,一个进程内自带一个线程,线程才是执行单位 2.进程VS线程 同一进程内的线程们共享 ...

  6. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  7. python并发编程之线程/协程

    python并发编程之线程/协程 part 4: 异步阻塞例子与生产者消费者模型 同步阻塞 调用函数必须等待结果\cpu没工作input sleep recv accept connect get 同 ...

  8. Scala 深入浅出实战经典 第68讲:Scala并发编程原生线程Actor、Cass Class下的消息传递和偏函数实战解析

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载: 百度云盘:http://pan.baidu.com/s/1c0noOt ...

  9. Python 3 并发编程多进程之队列(推荐使用)

    Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...

随机推荐

  1. 7_4 素数环(UVa524)<回溯法和生成-测试法的比较>

    有一个环(ring)是由n个圈圈所组成的(在这里n一定是个偶数),我们想要把1到n的自然数各放到一个圈圈中,使得相邻2个圈圈中的数的和一定是素数.下图为n=6的情形.请注意:第1个圈圈中的数一定是1. ...

  2. 寒假安卓app开发学习记录(4)

    今天的任务第一个项目运行并部署.没想到第一个环节就出现了错误,运行之后eclipse报错:Errors occurred during the build.Errors running builder ...

  3. angular 中引入 markdown

    ngx-markdown 是 Angular2+ 的一个第三方库,它的主要功能是将md文件转换为HTML格式,并且支持语法高亮. GITHUB地址:https://github.com/jfcere/ ...

  4. 动态链接--运行时加载dlopen

    前面我们在编译可执行文件时,如果可执行文件要依赖某个so.必须要通过-L指定so路径,并且-l指定so名字. 而且在可执行文件运行时,要先加载so的load部分到进程地址空间. 有一种方式可以在编译时 ...

  5. PHP中使用CURL实现Get和Post请求方法

    1.cURL介绍 cURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等.最爽的是,PHP也支持 cURL 库.本文将介绍 cURL的一些高级特性, ...

  6. JavaScript 推箱子游戏

    推箱子游戏的 逻辑非常简单,但是如果不动手的话,还是不太清楚.我在这里讲一下自己的思路. 制作推箱子,首先要有自己的设计素材.如下我也是网上找的素材 第二步,理清游戏的规则. 游戏规则: 1.小人将箱 ...

  7. paramiko-tools

    own dev # coding=utf-8 import paramiko import os import logging import json import unittest from sta ...

  8. Python实现一个桌面版的翻译工具【新手必学】

      Python 用了好长一段时间了,起初是基于对爬虫的兴趣而接触到的.随着不断的深入,慢慢的转了其它语言,毕竟工作机会真的太少了.很多技能长时间不去用,就会出现遗忘,也就有了整理一下,供初学者学习和 ...

  9. WordPress 安装教程

    1.要安装WordPress,先看他的环境要求 2.环境符合后,直接去官网下载 WordPress(点击去官网) 下载最新的安装包 3.下载解压后,直接在浏览器中访问 会自动跳转到安装界面 http: ...

  10. Java将数据进行分组处理

    将传人的数据进行分组,使用map保存每组的数据. /** * 将取出的数据进行分组 * @param list * @return */ public Map<Integer,Object> ...