1. 前言

大家好,我是安果!

最近有小伙伴后台给我留言,说自己用 Django 写了一个大文件上传的 Api 接口,现在想本地检验一下接口并发的稳定性,问我有没有好的方案

本篇文章以文件上传为例,聊聊 Jmeter 并发执行 Python 脚本的完整流程

2. Python 实现文件上传

大文件上传包含 3 个步骤,分别是:

  • 获取文件信息及切片数目

  • 分段切片,并上传 - API

  • 文件合并 - API

  • 文件路径参数化

2-1  获取文件信息及切片数目

首先,获取文件的大小

然后,利用预设的切片大小获取分段总数

最后,获取文件名及 md5 值

import os
import math
import hashlib def get_file_md5(self, file_path):
"""获取文件的md5值"""
with open(file_path, 'rb') as f:
data = f.read()
return hashlib.md5(data).hexdigest() def get_filename(self, filepath):
"""获取文件原始名称"""
# 文件名带后缀
filename_with_suffix = os.path.basename(filepath)
# 文件名
filename = filename_with_suffix.split('.')[0]
# 后缀名
suffix = filename_with_suffix.split('.')[-1]
return filename_with_suffix, filename, suffix def get_chunk_info(self, file_path):
"""获取分段信息"""
# 获取文件总大小(字节)
file_total_size = os.path.getsize(file_path)
print(file_total_size) # 分段总数
total_chunks_num = math.ceil(file_total_size / self.chunk_size)
# 文件名(带后缀)
filename = self.get_filename(file_path)[0]
# 文件的md5值
file_md5 = self.get_file_md5(file_path)
return file_total_size, total_chunks_num, filename, file_md5

2-2  切片及分段上传

利用分段总数和分段大小,对文件进行切片,调用分段文件上传接口

import requests

def do_chunk_and_upload(self, file_path):
​ """将文件分段处理,并上传"""
file_total_size, total_chunks_num, filename, file_md5 = self.get_chunk_info(file_path) # 遍历
for index in range(total_chunks_num):
print('第{}次文件上传'.format(index + 1))
if index + 1 == total_chunks_num:
partSize = file_total_size % chunk_size
else:
partSize = chunk_size # 文件偏移量
offset = index * chunk_size # 生成分片id,从1开始
chunk_id = index + 1 print('开始准备上传文件')
print("分片id:", chunk_id, "文件偏移量:", offset, ",当前分片大小:", partSize, ) # 分段上传文件
self.__upload(offset, chunk_id, file_path, file_md5, filename, partSize, total_chunks_num) def __upload(self, offset, chunk_id, file_path, file_md5, filename, partSize, total):
"""分次上传文件"""
url = 'http://**/file/brust/upload'
params = {'chunk': chunk_id,
'fileMD5': file_md5,
'fileName': filename,
'partSize': partSize,
'total': total
}
# 根据文件路径及偏移量,读取文件二进制数据
current_file = open(file_path, 'rb')
current_file.seek(offset) files = {'file': current_file.read(partSize)}
resp = requests.post(url, params=params, files=files).text
print(resp)

2-3  合并文件

最后调用合并文件的接口,将分段小文件合成大文件

def merge_file(self, filepath):
"""合并"""
url = 'http://**/file/brust/merge'
file_total_size, total_chunks_num, filename, file_md5 = self.get_chunk_info(filepath)
​ payload = json.dumps(
{
"fileMD5": file_md5,
"chunkTotal": total_chunks_num,
"fileName": filename
}
)
print(payload)
headers = {
"Content-Type": "application/json"
}
resp = requests.post(url, headers=headers, data=payload).text
print(resp)

2-4  文件路径参数化

为了并发执行,将文件上传路径参数化

# fileupload.py
...
if __name__ == '__main__':
filepath = sys.argv[1] # 每一段切片的大小(MB)
chunk_size = 2 * 1024 * 1024 fileApi = FileApi(chunk_size)
# 分段上传
fileApi.do_chunk_and_upload(filepath) # 合并
fileApi.merge_file(filepath)

3. Jmeter 并发执行

在使用 Jmeter 创建并发流程前,我们需要编写批处理脚本

其中,执行批处理脚本时,需要跟上文件路径一起执行

# cmd.bat

@echo off
set filepath=%1 python C:\Users\xingag\Desktop\rpc_demo\fileupload.py %*

然后,在本地新建一个 CSV 文件,写入多个文件路径

# 准备多个文件路径(csv)
C:\\Users\\xingag\\Desktop\\charles-proxy-4.6.1-win64.msi
C:\\Users\\xingag\\Desktop\\V2.0.pdf
C:\\Users\\xingag\\Desktop\\HBuilder1.zip
C:\\Users\\xingag\\Desktop\\HBuilder2.zip

接着,就可以使用 Jmeter 创建并发流程了

完整步骤如下:

  • 创建一个测试计划,下面添加一个线程组

    这里线程组数目与上面文件数目保持一致即可

  • 线程组下,添加「 同步定时器 」

    同步定时器中的「 模拟用户组的数量 」和上面参数数量保持一致

  • 添加 CSV 数据文件设置

    指向上面准备的 csv 数据文件,设置文件格式为 UTF-8,变量名称设置为 file_path,最后将线程共享模式设置为「 当前线程组 」

  • 添加调试取样器,方便调试

  • 添加 OS 进程取样器

    选择上面创建的批处理文件,命令行参数设置为「 ${file_path} 」

  • 添加查看结果数

4. 最后

运行上面创建的 Jmeter 并发流程,在结果数中可以查看并发上传文件的结果

当然,我们可以增加并发数量去模拟真实的使用场景,只需要修改 CSV 数据源及 Jmeter 参数即可

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

聊聊 Jmeter 如何并发执行 Python 脚本的更多相关文章

  1. jmeter 执行python脚本的方法 。(亲测ok)

    jmeter 执行python脚本   jmeter 可以通过Jython 执:行python代码 1.下载Jython jar包:http://www.jython.org/downloads.ht ...

  2. inotify+rsync实现实时同步(附解决crontab中无法执行python脚本的问题)

    1.准备环境 # 系统支持的话,下面的目录就会存在 ls /proc/sys/fs/inotify/ rpm -qa inotify-tools yum -y install inotify-tool ...

  3. 使用sae定时执行Python脚本

    使用sae定时执行Python脚本 使用sae定时执行Python脚本 12,May,2014 | 57 Views 毕设压力略大,必须是桂林游的锅.去之前放松了几天,回来又休闲了几天,加上桂林的一周 ...

  4. mac上使用crontab周期性执行python脚本

    这个月买了本书<Linux系统命令及Shell脚本实践指南>, 看到了一个周期性执行任务cron.顿时产生一个想法: mac上有这种机制么? 加上自己也在15年下半年也学了点python脚 ...

  5. linux下设置计划任务执行python脚本

    linux下设置计划任务执行python脚本 简介 crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自 ...

  6. 怎样在windows上定时执行python脚本

    作为一个需要在电脑上工作和学习的人,一件十分困扰我的事情就是怎样不受互联网中其他内容的干扰而专注于自己想要做的事情,有的时候真的是沉浸于微博上的消息,忘了自己本来想要做的事.不过我有一件神器,自己爱豆 ...

  7. Windows 任务调度程序定时执行Python脚本

    Windows 任务调度程序(Task Scheduler)可以定时执行程序,本文分享使用Task Scheduler定时执行Python脚本的两种方法. 在控制面版->管理员工具中打开 Tas ...

  8. windows 10 如何设定计划任务自动执行 python 脚本?

    我用 python 写了一些脚本,有一些是爬虫脚本,比如爬取知乎特定话题的热门问题,有一些是定期的统计分析脚本,输出统计结果到文档中.之前我都是手动执行这些脚本,现在我希望如何这些脚本能自动定时执行. ...

  9. shell脚本中执行python脚本并接收其返回值的例子

    1.在shell脚本执行python脚本时,需要通过python脚本的返回值来判断后面程序要执行的命令 例:有两个py程序  hello.py 复制代码代码如下: def main():    pri ...

随机推荐

  1. Linux下Nginx基础应用

    Nginx简介: Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.其将源代码以类BSD许可证的形式发布,因 ...

  2. Hadoop 3.1.1 - 概述 - 集群安装

    Hadoop 集群安装 目标 本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群.如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装). 本文并不包含诸如安 ...

  3. python语法入门

    程序=数据+功能        我们学习编程语言的目的是为了控制计算机能够像人一样去做事        所以说,编程语言中出现的所有的语法都是为了控制计算机能够像人一样去做xxx事  一.注释:  1 ...

  4. 工作中后端是如何将API提供出去的?swaggo很不错

    工作中后端是如何将API提供出去的?swaggo很不错 咱们上一次简单分享了 GO 权限管理之 Casbin ,他一般指根据系统设置的安全规则或者安全策略 分享了权限管理是什么 Casbin 是什么 ...

  5. Distribute SSH Pubkey to Multiple Hosts with Fabric

    Generate ssh keys on source host with ssh-keygen; Disable known_hosts prompt(optional): add "St ...

  6. 跟我一起写 Makefile(六)

    书写命令 ---- 每条规则中的命令和操作系统Shell的命令行是一致的.make会一按顺序一条一条的执行命令,每条命令的开头必须以[Tab]键开头,除非,命令是紧跟在依赖规则后面的分号后的.在命令行 ...

  7. linux基础操作命令合集(一)

    linux基础操作命令合集(一) 目录 linux基础操作命令合集(一) 一.命令行提示符 二.切换用户 三.主机名称命令 3.1.临时设置主机名 3.2.永久设置主机名 四.查看系统版本 五.网卡相 ...

  8. Kurento实战之三:知识点小导游

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  9. MATLAB—命令窗、文件夹、路径、工作内存区、帮助系统

    文章目录 一.命令窗操作 1.命令窗的显示 2.数据显示格式 3.命令行的标点符号 4.命令窗常用控制命令 5.指令行编辑 二.当前文件夹和路径设置 1.当前文件夹及其使用 2.搜索路径和路径设置 三 ...

  10. SQL 练习10

    查询没有学全所有课程的同学的信息 分析 先查询出所有课程的数量 select count(cid) from course 再查询出成绩表中课程数量=总课数的人员 select sid from sc ...