python并发编程5-线程

一、复习

# 线程# 线程是进程中的执行单位# 线程是CPU调度的最小单位# 线程之间资源共享## 线程的开启和关闭以及切换的时间开销远远小于进程# 线程本身可以在同一时间使用多个CPU
# threading# 使用方法类似于multiprocess
# python与线程# CPython解释器在解释代码中容易产生数据不安全的问题# GIL 全局解释器 锁的是线程

二、守护线程

例子1:

例子2:

例子3:

原因分析:

# 守护进程随着主进程代码的执行结束而结束
# 守护线程会在主线程结束之后等待其他子线程的结束才结束
# 原因解析:
# 1.对主进程来说,运行完毕指的是主进程代码运行完毕
# 2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕# 1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),# 然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,
# 2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。# 因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,# 而线程必须保证非守护线程都运行完毕后才能结束。

例子4:进程

例子5:守护线程

三、线程锁

进程 多进程情况下一般不用加锁。除非是操作文件之类的东西

解决上述阻塞的办法:加锁

def func(lock):global nlock.acquire()temp=ntime.sleep(1)n=temp-1lock.release()
n=10
t_lst=[]
lock=Lock()
for i in range(10):t=Thread(target=func,args=(lock,))t.start()t_lst.append(t)
for t in t_lst:t.join()
print(n)

最终运行结果为:0

2、互斥锁-科学家吃面问题-死锁

只有一份面和一个叉子。科学家公平竞争,就会有一个人拿到叉子,一个人拿到面。这就是典型的死锁问题只有一份面和一个叉子。科学家公平竞争,就会有一个人拿到叉子,一个人拿到面。这就是典型的死锁问题

noodle_lock=Lock()
fork_lock=Lock()
def eat1(name):noodle_lock.acquire()print('%s拿到面条了'%name)fork_lock.acquire()print('%s拿到叉子了'%name)print('%s吃面'%name)fork_lock.release()noodle_lock.release()
def eat2(name):fork_lock.acquire()print('%s拿到面条了'%name)time.sleep(1)noodle_lock.acquire()print('%s拿到叉子了'%name)print('%s吃面'%name)noodle_lock.release()fork_lock.release()Thread(target=eat1,args=('alex',)).start()
Thread(target=eat2,args=('Egon',)).start()
Thread(target=eat1,args=('bossjin',)).start()
Thread(target=eat2,args=('nezha',)).start()

运行结果:

2、解决互斥锁问题-RLock介绍

4、解锁科学家吃面问题-递归锁

'''5 递归锁'''  # 解决死锁问题,一个线程中可以acquire多次
noodle_lock=fork_lock=RLock() # 一个钥匙串上的两把钥匙
def eat1(name):noodle_lock.acquire()print('%s拿到面条了'%name)fork_lock.acquire()print('%s拿到叉子了'%name)print('%s吃面'%name)fork_lock.release()noodle_lock.release()
def eat2(name):fork_lock.acquire()print('%s拿到面条了'%name)time.sleep(1)noodle_lock.acquire()print('%s拿到叉子了'%name)print('%s吃面'%name)noodle_lock.release()fork_lock.release()Thread(target=eat1,args=('alex',)).start()
Thread(target=eat2,args=('Egon',)).start()
Thread(target=eat1,args=('bossjin',)).start()
Thread(target=eat2,args=('nezha',)).start()

运行结果:

四、信号量:控制多个线程同时访问同一段代码

from threading import Semaphore,Thread
# 控制有多个线程访问同一代码
import time
def func(sem,a,b):sem.acquire()time.sleep(1)print(a+b)sem.release()
sem=Semaphore(4)
for i in range(10):t=Thread(target=func,args=(sem,i,i+5))t.start()

运行结果:
四个数字,四个数字输出,最后输出剩余2个

五、事件

# 事件被创建的时候:False状态。导致wait()阻塞#  True状态 wait 非阻塞# clear 设置状态为False# set  设置状态为True
# 数据库 -文件夹
# 文件夹里有好多excel表格# 1.能够更方便的对数据进行增删查改# 2.安全访问的机制
# 连接数据库
# 检测数据库的可连接情况# 起两个线程
# 第一个线程:连接数据库# 等待一个信号 告诉我我们之间的网络是通的# 连接数据库
# 第二个线程:检测与数据库之间的网络是否连通# time.sleep(0,2)# 将事件的状态设置为True
def db_connect(e):count=0while count<3:e.wait(1)  # 状态为False时,我只等待0.5s就结束if e.is_set():print('数据库连接成功')breakelse:count+=1print('第%s次连接失败'%count)# else:#     raise TimeoutError('连接数据库超时')def check_web(e):time.sleep(random.randint(0,3))e.set()
e=Event()
Thread(target=db_connect,args=(e,)).start()
Thread(target=check_web,args=(e,)).start()

 运行结果是随机的

6、条件

# 条件
# acquire release
# 一个条件被创建之初 默认有一个False 状态
# False状态会影响wait会一直处于等待状态
# notify(int数据类型)造钥匙
# 想用wait必须先acquire下

condition相当于锁,但是用完不还

def func(con,i):con.acquire()con.wait()  # 等钥匙print('在第%s个循环里'%i)con.release()
con=Condition()
for i in range(10):Thread(target=func,args=(con,i)).start()
while True:num=int(input('>>>'))con.acquire()con.notify(num)con.release()  # 用完钥匙不会归还

 运行结果:

7、定时器:定时开启线程

例子1:

def func():print('时间同步')
Timer(2,func).start()  # 等待两秒开启线程,异步 非阻塞
print(1234)

例子2:

def func():print('时间同步')
while True:Timer(2,func).start()time.sleep(2)

运行结果:

每隔两秒输出一个时间同步。。

8、队列

队列的前提:

方法介绍:

队列类型一:

q=queue.Queue()
q.get()
q.put_nowait() # 队列满后会报错,进行异常处理
q.get()
q.get_nowait()  # 队列中无数据时会报错,进行异常处理
# 队列:先进先出
# 队列:线程安全的

 队列类型2-栈:
 

q=queue.LifoQueue()  # 栈:后进先出
q.put(1)
q.put(2)
print(q.get())
print(q.get())

运行结果:

队列类型3-优先级队列:

q=queue.PriorityQueue()  # 优先级队列:先按值排序,再用ASCII排序
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))
q.put((1,'e'))
q.put((1,'d'))   # 先出
print(q.get())

运行结果:

9、线程池

# 线程池
# submit() 异步提交
# map(func,*iterables,timeout=None) 取代for循环submit操作
# shutdown(wait=True)
# 相当于进程池的pool.close()+pool.join()# wait=True,等待池内所有任务执行完毕回收资源后才继续
# wait=False,立即返回,并不会等待池内的任务执行完毕
# 但不管wait参数为何值,整个程序都会等到所有任务执行完毕
# submit和map必须在shutdown之前
# result 取得结果
# add_done_callback() 回调函数

 例子1-submit应用:

from concurrent.futures import ThreadPoolExecutor
import time
'''1'''
def func(n):time.sleep(2)print(n)
tpool=ThreadPoolExecutor(max_workers=5)  # 一般cpu个数乘5以内个线程
for i in range(10):tpool.submit(func,i)
tpool.shutdown()   # 等价于close+join功能
print('主线程')  # 异步

运行结果:
5个数5个数输出

例子2:
 

'''2 线程池'''  
#若为进程池,则只需将ThreadPoolExecute替换为ProcessPoolExecute
def func(n):time.sleep(2)print(n)return n*n
tpool=ThreadPoolExecutor(max_workers=5)  # 一般cpu个数乘5以内个线程
t_lst=[]
for i in range(8):t=tpool.submit(func,i)t_lst.append(t)
# tpool.shutdown()   # 等价于close+join功能
print('主线程')  # 异步
for t in t_lst:print('***',t.result()) # 一定按顺序打印

运行结果:

例子3-map

def func(n):time.sleep(2)print(n)return n*n
tpool=ThreadPoolExecutor(max_workers=5)  # 一般cpu个数乘5以内个线程
tpool.map(func,range(8))  # 拿不到返回值

 运行结果:
5个5个输出

例子4-callback使用

def call_back(m):print('结果是 %s '%m.result())
def func(n):time.sleep(2)print(n)return n*n
tpool=ThreadPoolExecutor(max_workers=5)  # 一般cpu个数乘5以内个线程
for i in range(8):tpool.submit(func,i).add_done_callback(call_back)

运行结果:

参考自http://www.cnblogs.com/Eva-J/articles/8306047.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568301.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python并发编程6-协程

1、基础 # 进程 启动多个进程 进程之间是由操作系统&#xff08;时间片轮转&#xff09;负责调用 # 线程 启动多个线程 真正被CPU执行的最小单位是线程# 开启一个线程 创建一个线程 寄存器 堆栈# 关闭一个线程 等都需要时间 # 协程&#xff1a;本质上是一个线程# 能够在多个任…

JMeter之HTTP请求上传文件/上传图片

Jmeter实现接口上传图片 一、Fiddler抓包上传图片接口 查看WebForms&#xff0c;接口传参为空&#xff0c;文件/图片传参为<file>对用的Name值&#xff1a; Content-Disposition: form-data; name"file"; filename"IMG_20191116_110507.jpg" Con…

Jmeter吞吐量控制器详解

一、吞吐量控制器 吞吐量控制器(Throughput Controller)用来控制其下元件的执行次数&#xff0c;并无控制吞吐量的功能。 作用&#xff1a;控制其下的子节点的执行次数与负载比例分配 吞吐量控制器字段介绍&#xff1a; Total Executions&#xff1a;执行百分比&#xff08;…

Jmeter之json条件提取实战(三)

有时我们想通过接口响应数据中的默写条件进行提取对应的字段&#xff0c;这时&#xff0c;就可以用到json条件提取&#xff0c;可以提取对应的值进行使用或迭代。 接口请求地址&#xff1a; sh.lianjia.com/api/newhouserecommend?type1&queryhttps%3A%2F%2Fsh.lianjia.…

Python自动化测试问题及处理方法(一)

一、接口自动化测试中&#xff0c;会用到测试账号&#xff0c;如何合理运用账号&#xff1f; 账号一般用于接口登录、接口用例传参、操作sql等&#xff0c;目前账号是写到yaml配置文件里&#xff0c;如果1个账户使用会出现资源冲突&#xff0c;可以配置多个账号使用&#xff0…

Pytest框架集成Allure定制测试报告详解(一)

Allure简介 Allure是一款非常轻量级并且非常灵活的开源测试报告生成框架。 它支持绝大多数测试框架&#xff0c; 例如TestNG、Pytest、JUint等。它简单易用&#xff0c;易于集成。下面就Pytest如何与Allure集成做详细介绍。 Pytest框架集成Allure Pytest是Python的单元测试框架…

Pytest+Allure+Jenkins接口自动化项目实战(一)

经过一周多时间&#xff0c;基于pythonpytestexcelallure框架的接口自动化测试初版已基本实现&#xff0c;包括基本配置读取、用例读取、用例执行、sql读取执行、前置数据准备、后置数据清理以及测试报告生成等&#xff0c;环境独立运行、项目独立运行、用例独立运行、jenkins集…

Jmeter BeanShell取样器操作变量(一)

vars: 引用Jmeter线程的局部变量&#xff0c;将 局部变量 改为 全局变量 亦可达到引用全局变量的效果&#xff0c; 连通Jmeter 和 beanshell string user vars.get("user")//获取变量&#xff0c;保存变量 vars.put&#xff08;String key, String value&#xf…

Jmeter Beanshell采样器调用JAVA方法(二)

BeanShell Sampler调用添加的java方法 1、BeanShell Sampler里添加java方法 public static String test() {vars.put("jmeter1","111");vars.put("jmeter2","222");vars.put("jmeter3","333");vars.put("j…

Jmeter BeanShell采样器提取接口响应并传递(三)

1、将fastjson-1.2.68.jar放置C:\jmeter\apache-jmeter-5.0\lib路径下 2、CSV 数据文件设置多个手机号 3、添加登录接口&#xff0c;${mobile}调用2种的mobile值 4、登录接口响应数据 5、BeanShell 取样器提取登录接口响应数据 //导入json包 import com.alibaba.fastjson.JSON…

Jmeter BeanShell采样器提取接口响应写入csv文件(四)

1、调用登录接口获取response数据 {"code":0,"msg":"成功","data":{"token":"bearereyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9tZW1iZXItYXBpLnN0MS50ZXN0LmxhbnhpbmthLmNvbVwvMi4wXC91c2Vyc1wvb…

Jmeter JDBC Request执行多条SQL语句

之前写过Jmeter操作mysql的文章https://blog.csdn.net/qq_36502272/article/details/88891873今天我们再看下如何操作多条sql语句 1、添加JDBC Connection Configuration并配置 Database URL为MySQL的连接串&#xff0c;如果要执行多条SQL语句&#xff0c;后面还要添加“?al…

Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2

一般我们做自动化测试时&#xff0c;一个用例会写多个断言&#xff0c;当第一个断言失败后&#xff0c;后面的代码就不会执行了&#xff0c;于是我们引进了pytest-assume插件可以解决断言失败后继续断言的问题。一、安装依赖包pip install pytest-assume二、使用assert进行断言…

无法打开包括文件: “corecrt.h”: No such file or directory

刚开始安装qt&#xff0c;测试是否安装成功就出现此问题&#xff0c;让人很头大 参考&#xff1a;https://blog.csdn.net/x356982611/article/details/51140807的播客 编译时候使用的是最新的sdk版本10.0.10586.0版本但是它里面没有ucrt目录&#xff0c;问题找到了。 看了下v…

Pytest参数选项在脚本中和命令行用法详解

运行pytest可以指定目录和文件&#xff0c;如果不指定&#xff0c;pytest会搜索当前目录及其子目录中以test_开头或以_test结尾得测试函数。我们把pytest搜索测试文件和测试用例的过程称为测试搜索&#xff08;test discovery&#xff09;。只要遵循pytest的命名规则&#xff0…

Win7下OpenCV3.2.0+VS2015配置

参考自&#xff1a;https://blog.csdn.net/qq_22812319/article/details/78335880 一、预备知识 1、下载opencv时&#xff0c;opencv与vs版本是有固定关系的。 2、vs一般使用release版本。 3、首先在下载的openCV解压目录opencv/build/x64/下查看文件夹名&#xff0c;如下图…

win7 vs2015配置qt5.11

1、下载vs&#xff0c;和qt。 qt百度网盘下载链接&#xff1a;https://pan.baidu.com/s/12bUt31_mXGvgc3tdJRkkkw 提取码&#xff1a;2swk 下载完成之后&#xff0c;直接进行安装&#xff0c;下一步。 安装的时候要根据自己的VS版本选择相应的msvc&#xff08;VC运行库&…

原创 | 开源AI测试专题、Jmeter测试专题

开源 AI 测试专题震惊&#xff01;AI成功落地自动化测试AI 软件测试工具 Mabl 快速概览AI测试工具 Mabl - 测试用例自动自愈Sauce Labs 的持续 UI 自动化测试云疫情中诞生的 AI 测试工具&#xff1a;ai-webdriverAI 测试又多新花招&#xff1f;ai-webdriver-1.0.1 独家更新一眼…

Python深层解析json数据之JsonPath

我们在做接口自动化时&#xff0c;一般接口响应的都是json数据体&#xff0c;对响应数据进行提取使用或断言&#xff0c;当数据量很大或层级很深时&#xff0c;就会变得很麻烦&#xff0c;于是就可以用到jsonpath模块&#xff0c;解决json路径深取值难的问题。一、 jsonpath介绍…

VS2015+qt5.11入门(实现计算机的加法和登录操作)

1、在vs中新建qt项目 2、打开Form Files中的.ui文件。即打开qt creator界面 3、在界面中添加两个label&#xff0c;两个LineEdit&#xff0c;一个计算按钮。点击保存 控件右击-->改变对象名称可以直接改变控件名。&#xff08;会映射显示在vs中的ui_projectname.h中&…