python多线程并发测试过程

 更新时间:2025年05月27日 15:25:35   作者:姑娘别秃头  
这篇文章主要介绍了python多线程并发测试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、并发与并行?

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_time
    print(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:kargs
    t2 = Thread(target=work, kwargs={"name":"wupig","age":18})
    t2.start()

传递参数:继承类

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

1、无法并行,原因是python解释器有一把锁:GIL,在同一时间只能执行一个线程。多线程是并发执行的,经过python解释器后进行线程调度,线程切换机制:

2、线程执行遇到IO耗时操作(sleep,网络io,文件io),python解释器释放锁,进行线程切换,再次获取全局锁。

3、线程执行时间达到一定的阈值(面试)

解决方法一:加锁

解决方法二:队列

死锁案例:

需求:

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=10
    atest_thread(count, audio_test)
    endtime=time.time()-starttime
    print(endtime)

占坑

这样只有一个线程执行。需要创建列表,将线程放入列表中,然后循环变量列表进行json。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Biblibili视频投稿接口分析并以Python实现自动投稿功能

    Biblibili视频投稿接口分析并以Python实现自动投稿功能

    这篇文章主要介绍了Biblibili视频投稿接口分析并以Python实现自动投稿功能,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python学习之路之pycharm的第一个项目搭建过程

    Python学习之路之pycharm的第一个项目搭建过程

    这篇文章主要介绍了Python学习之路之pycharm的第一个项目搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 浅析python3中的os.path.dirname(__file__)的使用

    浅析python3中的os.path.dirname(__file__)的使用

    这篇文章主要介绍了python3中的os.path.dirname(__file__)的使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • python字符串验证的几种实现方法

    python字符串验证的几种实现方法

    字符串的验证是确保数据符合特定要求的关键步骤之一,本文主要介绍了python字符串验证的几种实现方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 基于Django的Admin后台实现定制简单监控页

    基于Django的Admin后台实现定制简单监控页

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据。后台管理可以在各个app的admin.py文件中进行控制。本文将主要介绍如何利用Admin后台实现监控页的定制,快来和小编一起学习一下吧
    2021-12-12
  • django echarts饼图数据动态加载的实例

    django echarts饼图数据动态加载的实例

    今天小编就为大家分享一篇django echarts饼图数据动态加载的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python二叉树初识(新手也秒懂!)

    Python二叉树初识(新手也秒懂!)

    二叉树是一种简单的树形结构,其每个节点的分支节点数有0,1或2个,下面这篇文章主要给大家介绍了关于Python二叉树的相关资料,本文介绍的非常通俗易懂,新手也秒懂,需要的朋友可以参考下
    2022-05-05
  • python中语法糖的妙用分享

    python中语法糖的妙用分享

    在Python中,语法糖是指一些为了增加代码的可读性、易用性和简洁性而添加的特性,本文为大家整理了一些python中常见语法糖的使用,需要的小伙伴可以了解下
    2023-11-11
  • PyQt5实现多张图片显示并滚动

    PyQt5实现多张图片显示并滚动

    最近要做个网页图片批量下载工具,然后需要一个页面显示网页上的所有图片供用户勾选,再根据勾选的内容来下载指定图片,其中就涉及到要到同时显示多张图片,本文就来介绍一下
    2021-06-06
  • 跟老齐学Python之再深点,更懂list

    跟老齐学Python之再深点,更懂list

    对于list,由于她的确非常非常庞杂,在python中应用非常广泛,所以,虽然已经介绍完毕了基础内容,这里还要用一讲深入一点点,往往越深入越...
    2014-09-09

最新评论