python多线程并发测试

article/2025/10/7 18:08:56

python多线程

文章目录

  • python多线程
  • 一、并发与并行?
  • 二、同步与异步的概念?
  • 三、线程与进程的区别?
  • 需求1:多线程执行不同任务:
  • 需求2:多线程执行相同任务:
    • 1.threading并发性
    • 2.多线程并发---资源共享,资源竞争问题:


一、并发与并行?

1、多任务概念:操作系统可以同时运行多个任务。
2、并发:任务数量多于cpu核数,通过操作系统的任务调度算法,多个任务可以一起执行,实际总有一些任务不在一起执行,因为切换任务的速度相当快。宏观上是一起执行,微观上不是一起执行的。
3、并行:指的是任务数量小于cpu核数,即任务真的是一起执行。
⚠️多线程都是并发的状态,缺点是比并行慢

二、同步与异步的概念?

1、同步:协同步调


def work():print("1")
def work2():print("2")
if __name__ == '__main__':work()work2()

2、异步:步调各异

三、线程与进程的区别?

1、线程被包含在进程内,一个程序启动时,先启动进程,进程调用线程执行任务。
2.线程依赖进程。
3.线程可以被抢占(中断)

需求1:多线程执行不同任务:

1、函数

函数式:调用thread模块中的start_new_thread()函数来产生新线程:
thread.start_new_thread ( function, args[, kwargs] )
参数说明:
function - 线程函数。
args - 传递给线程函数的参数,他必须是个tuple类型。
kwargs - 可选参数
示例1:主线程不等待子线程
import time
import threading as td#为线程定义一个函数def asr_test1(url):print("start")print(time.ctime(time.time()))def asr_test2(url):print("end")print(time.ctime(time.time()))if __name__ == '__main__':
#target为函数名,args为元组,函数一定要输入形参t1=td.Thread(target=asr_test1,args=("",))t2 = td.Thread(target=asr_test1, args=("",))t1.start()t2.start()
结果:
start
Fri Aug  5 16:03:05 2022
start
Fri Aug  5 16:03:05 2022
示例2、主线程等待子线程执行完毕
import threading as th
def work():print("1")
def work2():print("2")#原理:启动时会调用python进程,进程调用主线程。
if __name__ == '__main__':'''子线程启动'''start_time = time.time()t1=th.Thread(target=work)t2 = th.Thread(target=work2)t1.start()t2.start()#主线程不会等待# t1.join(5)#设置主线程等待子线程的执行时间end = time.time() - start_timeprint(end)

thread提供了低级别的、原始的线程以及一个简单的锁。
Thread类提供以下方法:
run(): 用以表示线程活动的方法。
start():启动线程活动。
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
isAlive(): 返回线程是否活动的。
getName(): 返回线程名。
setName(): 设置线程名。

2、类包装线程对象

需求2:多线程执行相同任务:

1.threading并发性

线程并发运行并共享内存。

代码如下(重写run方法,继承Thread类):

import time
from threading import Thread
'''
Thread其他初始化参数:
target:指定任务函数
name:指定线程分组
'''
class MyThread(Thread):def run(self):for i in range(100):time.sleep(0.1)print("请求第{}次".format(self.name,i))if __name__ == '__main__':for i in range(5):t=MyThread(name=f"线程{i+1}")t.start()

传递参数一:

def work(name,age):for i in range(5):# time.sleep(1)print("{}work1----{}---{}".format(name,i,age))if __name__ == '__main__':#给任务函数传递参数,方式一:args参数,里面是元组# t=Thread(target=work,args=("",))# t.start()#方式2:kargst2 = Thread(target=work, kwargs={"name":"wupig","age":18})t2.start()

传递参数:继承类

在这里插入代码片

2.多线程并发—资源共享,资源竞争问题:

1、无法并行,原因是python解释器有一把锁:GIL,在同一时间只能执行一个线程。多线程是并发执行的,经过python解释器后进行线程调度,线程切换机制:
1、线程执行遇到IO耗时操作(sleep,网络io,文件io),python解释器释放锁,进行线程切换,再次获取全局锁。
2、线程执行时间达到一定的阈值(面试)
在这里插入图片描述

解决方法一:加锁
在这里插入图片描述

解决方法二:队列

死锁案例:
在这里插入图片描述

需求:
1、并发读取本地文件。
2、并发获取url地址。
xxx.txt文件中有很多URL地址,需求多并发获取。

'''需求:并发读取txt中的URL地址'''
list_test=[]
filename="../../url.txt"
file=open(filename,"r")
#列表推导式
list_test=[i.strip("\n") for i in file]
def audio_test():while list_test:url=list_test.pop()print(url)def atest_thread(THREAD_MAX, Test_Script):#创建空列表thread_list = []for i in range(int(THREAD_MAX)):# print("**************",i)thread_name = 'thread-' + str(i)print("thread_name",thread_name)new_thread = threading.Thread(target=Test_Script, args="", name=thread_name)thread_list.append(new_thread)new_thread.start()for thread_obj in thread_list:#thread_obj.join:等待至线程中止thread_obj.join()if __name__ == '__main__':starttime=time.time()count = 10# THREAD_MAX=10atest_thread(count, audio_test)endtime=time.time()-starttimeprint(endtime)

占坑
在这里插入图片描述
这样只有一个线程执行。需要创建列表,将线程放入列表中,然后循环变量列表进行json。


http://chatgpt.dhexx.cn/article/QMX6bBfb.shtml

相关文章

JAVA多线程并发

JAVA并发知识库 JAVA线程实现/创建方式 1.继承Thread类 Thread类本质上时实现了Runnable接口的一个实例,代表一个现成的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执…

多线程 与并发

官方文档 https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html 推荐《Java高并发编程详解:多线程与架构设计》 推荐《Java高并发编程详解:深入理解并发核心库》 有很多工具的基准测试 同步和异步 所谓同步就是一个任务的完成需…

多线程和并发问题详解

文章目录 一、进程与线程二、并发与并行1、线程安全问题:2、共享内存不可见性问题 三、创建线程四、Thread类详解五、其他方法六、实例 一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程&…

面试官:多线程问题你一问三不知,还要我怎么“放水”?

面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁... (一分钟后) 面试官:不知道?那好,说一下Lock 和 Synchronized 的区别? 程序员阿里:Lock是锁... 面试官:...会就会,不会就说不会,节省一下时间,s…

多线程(并发执行)

一、概念区分 1、并行与并发 并行 ​ 当系统有一个以上CPU时,同一时刻,当一个CPU在执行一个任务时,另一个CPU在执行另一个任务,两个任务互不抢占CPU资源,可以同时进行(多核CPU,一个CPU执行一…

2.多线程并发

1.说说你知道的创建线程的方式 1、继承Thread类,重写run方法。2、实现Runnable接口,重写run方法。3、实现Callable接口,重写call方法。4、通过线程池创建线程。 https://blog.csdn.net/u013541140/article/details/95225769 CachedThreadPoo…

C++多线程并发(一)--- 线程创建与管理

文章目录 前言一、何为并发1.1 并发与并行1.2 硬件并发与任务切换1.3 多线程并发与多进程并发 二、如何使用并发2.1 为什么使用并发2.2 在C中使用并发和多线程 三、C线程创建3.1 C11新标准多线程支持库3.2 线程创建的简单示例 更多文章: 前言 我们都听说过摩尔定律…

lrzsz

lrzsz是一款程序,在linux中可以代替ftp的上传和下载 安装lrzsz yum install -y lrzsz上传:rz 将文件上传到本地,默认上传到当前目录 该程序支持拖拽上传,如下图所示 上传成功后查看本地 下载:sz filename 例如&am…

linux之lrzsz

1、lrzsz介绍 我们利用lrzsz进行windows和linux间的文件上传下载 2、安装 在ubuntu系统下 sudo apt-get install lrzsz 在centos系统下 yum install lrzsz 3、使用 1)、windows上传文件到linux环境,使用如下命令 rz

文件传输工具rzsz

mac安装rz sz? 之前在item2上使用使用rz和sz时就直接夯住 发现是需要配置下 mac使用rz,sz进行文件传输(默认使用的终端为iterm2) 一、安装lrzsz brew install lrzsz 二、下载iterm2-zmodem 执行 git clone https://github.com/aikuyun/iterm2-zmodem.git cd …

【lrzsz】Linux上lrzsz的安装和使用

一、lrzsz简介 rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具。 rz 可以很方便的从客户端传文件到服务器,sz也可以很方便的从服务器传文件到客户端,就算中间隔着跳板机也不影响。 rz(receive Zmodem) sz(send Zmodem) 远程文…

Linux lrzsz 详解

和 FileZilla 功能类似用于上传文件,上传速度比较慢适用于比较小的文件 安装指令 $ sudo yum install lrzsz 使用方式 $ rz 注:1> rz 指令在那个目录就在在那个目录上传文件 2> 文件要上的目录一定要有权限,否则上传失败

linux rz命令安装

新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令。记录一下如何安装rz/sz命令的方法。 一、工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz/sz命令来上传/下载文件. 对于某些linux版本, rz/sz默认没有安装所以需要手工安装。 sz: 将…

rz sz

linux上很方便的上传下载文件工具rz和sz (本文适合linux入门的朋友) ######################################################### #《老男孩linux就业培训中心-初级班第七期第一节内容总结。 #linux上很方便的上传下载文件工具rz和sz #date:2011-06-15 #作者:老男…

Linux的rz命令

linux服务器rz命令上传文件 2016年09月10日 19:56:02 阅读数:11712 1、首先,要是服务器不支持rz命令的话,需要安装执行 yum -y install lrzsz 2、再输入rz -be命令,选择需要上传的本地文件

llrzsz

文章目录 官网解压配置编译安装复制到开发板并执行使用lrz从PC传开发板使用lsz从开发板传PC参考链接 今天给大家推荐一个很好用的工具。 你是不是感觉在没有网络时往linux中下载程序很麻烦(SD卡插拔),今天就教大家怎么通过串口和linux文件系统…

linux系统下的rz、sz详解

对于linux服务器来说,通常我们是通过一些ssh工具进行远程访问连接的,而对于经常使用它的人来说,少不了将文件上传下载到服务器。如何能够快速的同服务器进行文件的交互尤为重要。不然每次都打开单独的ssh客户端或者ftp很是浪费时间。今天&…

linux rzsz(lrzsz)安装

lrzsz 官网入口:https://ohse.de/uwe/software/lrzsz.html lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux 系统之间的文件传输,体积小速度快。感觉可以替代ftp了 lrzsz 在线安装: …

【Linux】第三章Linux环境基础开发工具使用(yum+rzsz+vim+g++和gcc+gdb+make和Makefile+进度条+git)

🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

【Linux基础】Linux软件包管理器yum的使用指南rzsz安装

【Linux基础】Linux软件包管理器yum的使用指南|rzsz安装 前言 主页: 潮.eth的博客_CSDN博客-C学习,C学习,数据结构and算法领域博主 Linux基础专栏: Linux基础_潮.eth的博客-CSDN博客 正文 文章目录 【Linux基础】Linux软件包管理器yum的使用指南|rzsz安装…