Python使用多线程并发测试FastDFS文件上传、删除

代码如下:

# main.py
import functools
import itertools
import json
import os
import sys
import time
from pathlib import Path
from typing import Callable, TypeVar# pip install asynctor httpx rich fastdfs-client
from asynctor import bulk_gather, run, timeit
from asynctor.tasks import ThreadGroup
from httpx import AsyncClienttry:from rich import print
except ImportError:...from fastdfs_client import FastdfsClientT = TypeVar("T")def catch_cost(func: Callable[..., T]) -> Callable[..., tuple[float, T]]:@functools.wraps(func)def wrapper(*args, **kw) -> tuple[float, T]:start = time.time()rv = func(*args, **kw)cost = round(time.time() - start, 1)return cost, rvreturn wrapper@timeit
async def show_result(output: Path, dfs: FastdfsClient) -> None:"""展示上传结果,验证返回的URL"""results = json.loads(output.read_text())print("Upload result:")print(results)urls = [url for _, url in results]if not os.getenv("NO_FETCH"):group_name = "group1"group_name_new = os.getenv("NEW_GROUP_NAME", group_name)changes = (group_name, group_name_new)# 使用协程并发请求图片URL,验证是否能按预期拿到图片async with AsyncClient(follow_redirects=True) as client:rs = await bulk_gather(client.get(url.replace(*changes)) for url in urls)print("URL concurrency result:\nstatus_code\telapsed\turl\tContentLength")for r in rs:print(r.status_code,r.elapsed,r.url,len(r.content) if r.status_code == 200 else r.text,)if "-d" in sys.argv or "--delete" in sys.argv:print("=" * 20)delete_all(urls, dfs)@timeit
def delete_all(urls: list[str], dfs: FastdfsClient) -> None:"""使用多线程批量删除远程文件"""with ThreadGroup() as tg:for url in urls:tg.soonify(catch_cost(dfs.delete_file))(url)for result in tg.results:print(result)@timeit
def main() -> None:total = 10client = FastdfsClient(["dfs.waketzheng.top"])if args := sys.argv[1:]:if (a1 := args[0]).isdigit():total = int(a1)elif (p := Path(a1)).is_file():run(show_result(p, client))returnd = Path.home() / "Pictures"assert d.exists(), f'文件夹({d})不存在'images = list(d.rglob("*.jp*g")) + list(d.rglob("*.JP*G"))assert images, f"{d}中没有jpeg图片"# 多进程并发上传文件with ThreadGroup() as tg:for index, p in zip(range(total), itertools.cycle(images)):tg.soonify(catch_cost(client.upload_as_url))(p.read_bytes())(p := Path("output.json")).write_text(json.dumps(tg.results))print(f"{total = }")if "--show" in args:run(show_result(p, client))if __name__ == "__main__":main()

使用:

python main.py --show

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

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

相关文章

深入理解Symfony调试工具:从原理到实践

引言 Symfony,作为一个功能强大的PHP框架,提供了一整套工具来帮助开发者在开发过程中进行调试。其中,调试工具是Symfony生态中不可或缺的一部分,它允许开发者实时查看应用程序的状态,包括但不限于变量值、服务调用、事…

python通过COM Interface控制CANoe

python通过COM Interface控制CANoe 介绍打开示例工程python代码示例介绍 通过python可以控制CANoe的启动和停止等其他操作,在做高阶的自动化项目时可以用到。 打开示例工程 python代码示例 # --------------------------------------------------------------------------…

卫星网络——Walker星座简单介绍

一、星座构型介绍 近年来,随着卫星应用领的不断拓展,许多任务已经无法单纯依靠单颗卫星来完成。与单个卫星相比,卫星星座的覆盖范围显著增加,合理的星座构型可以使其达到全球连续覆盖或全球多重连续覆盖,这样的特性使得…

Redis三种模式——主从复制、哨兵模式、集群

一、Redis模式 Redis有三种模式:分别是主从同步/复制、哨兵模式、Cluster 主从复制:主从复制是高可用Redis的基础,哨兵和群集都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简…

使用Python进行计算机视觉

哈喽,大家好,我是木头左! 简介 计算机视觉是一门研究如何使机器“看”世界的科学。它涉及到图像处理、模式识别、机器学习等多个领域。近年来,随着深度学习的发展,计算机视觉取得了显著的进步。Python作为一门广泛应用于数据科学和人工智能的编程语言,为计算机视觉提供了…

关于ORACLE单例数据库中的logfile的切换、删除以及添加

一、有关logfile的状态解释 UNUSED: 尚未记录change的空白group(一般会出现在loggroup刚刚被添加,或者刚刚使用了reset logs打开数据库,或者使用clear logfile后) CURRENT: 当前正在被LGWR使用的gro…

深入理解【 String类】

目录 1、String类的重要性 2、常用方法 2、1 字符串构造 2、2 String对象的比较 2、3 字符串查找 2、4字符转换 数值和字符串转换: 大小写转化: 字符串转数组: 格式转化: 2、5 字符串替换 2、6字符串拆分 2、7 字符串…

Mysql中间件和高可用

文章目录 一、MySQL中间件代理服务器MycatMycat应用场景Mycat部署 实现读写分离 二、MySQL高可用高可用解决方案MHA高可用实现MHA 一、MySQL中间件代理服务器 数据库主要分为两大类:关系型数据库与 NoSQL 数据库(非关系型数据库)。 数据库主…

ATFX汇市:美国大非农数据来袭,美指与欧元或迎剧烈波动

ATFX汇市:今日20:30,美国劳工部将公布6月非农就业报告,其中新增非农就业人口数据最受关注,前值为27.2万人,预期值19万人,预期降幅高达8.2万人。如果公布值确实如预期一般,美联储降息预期将增强&…

以太网协议介绍——UDP

注:需要先了解一些以太网的背景知识,方便更好理解UDP协议、 以太网基础知识一 以太网基础知识二 UDP协议 UDP即用户数据报协议,是一种面向无连接的传输层协议,属于 TCP/IP 协议簇的一种。UDP具有消耗资源少、通信效率高等优点&a…

跟着峰哥学java 微信小程序 第二天 封装ES7 + 后端工作

1.前端 1.1使用promise封装 使用promise封装以至于在图片路径 统一路径中修改 //封装统一请求域名 const baseUrl "http://localhost:8080"; //封装后需导出 export const getBaseUrl()>{return baseUrl; } 导入外来资源 初始化数据 设置数据 将处理后的数据…

力扣热100 滑动窗口

这里写目录标题 3. 无重复字符的最长子串438. 找到字符串中所有字母异位词 3. 无重复字符的最长子串 左右指针left和right里面的字符串一直是没有重复的 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 左右指针leftright0ans0#初始化结果tablecolle…

AIGI赋能未来:人工智能如何重塑电子电路学习体验

文章目录 一、掌握基础知识与技能1. 扎实理论基础2. 熟练使用工具 二、融合AI技术提升学习效率1. 利用AI辅助学习平台2. 应用AI工具进行电路设计与仿真 三、探索创新应用方向1. 关注AI与电子电路的交叉领域2. 参与开源项目和竞赛 四、培养跨学科思维1. 加强数学与计算机科学知识…

javax.net.ssl.SSLHandshakeException: 解决方式

请求第三方接口的时候报javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 网站与…

解决使用PPIO欧派云服务器时无法使用sftp的问题

首先在对外TCP端口中选择22端口: 在连接-端口映射中可以看到: 使用ssh连接云服务器,更新包列表并安装OpenSSH服务器: apt-get update apt-get install-y openssh-server 创建 SSH 运行目录: mkdir /var/run/sshd 设…

Linux: 命令行参数和环境变量究竟是什么?

Linux: 命令行参数和环境变量究竟是什么? 一、命令行参数1.1 main函数参数意义1.2 命令行参数概念1.3 命令行参数实例 二、环境变量2.1 环境变量概念2.2 环境变量:PATH2.2.1 如何查看PATH中的内容2.2.2 如何让自己的可执行文件不带路径运行 2.3 环境变量…

Android车载开发中调试app与bat结合的丝滑小妙招

项目场景: 做Android车载的小伙伴调试app的时候常年就是手动adb命令三连,例如我常用的adb推送apk的命令 adb root adb remount adb push D:\workspace_atc\XSP3-10A\AutoSystemUIPlugin\app\release\CarSystemUI.apk /system/priv-app/CarSystemUI …

kylin arm xcb版本异常问题解决

源码编译qt 未生成xcb库,查看源码xcb readme.txt 提示 版本要求 下载 [ANNOUNCE] libxcb 1.14 [ANNOUNCE] xcb-proto 1.14 解压源码编译, 先编译xcb-proto sudo ./configure --prefix/usr/local/xcb-proto make make install 在编译xcb export PKG_CONFIG_PATH…

使用 ESP32 实现无线对讲机功能涉及音频采集、音频传输以及音频播放等多个方面。实现无线对讲机功能的基本步骤和示例代码。

硬件准备 两个 ESP32 开发板两个 MAX9814 麦克风模块(或其他兼容的模拟麦克风模块)两个 MAX98357A DAC 模块(或其他兼容的音频放大器模块)扬声器 接线 麦克风模块 -> ESP32 ADC 引脚ESP32 DAC 引脚 -> 音频放大器模块 -&…

并发编程(多线程)带来了哪些问题?

前面我们了解到多线程技术有很多好处,比如说多线程可以充分利用多核 CPU 的计算能力,那多线程难道就没有一点缺点吗? 有。 多线程很难掌握,稍不注意,就容易使程序崩溃。我们以在路上开车为例: 在一个单向行驶的道路上,每辆汽车都遵守交通规则,这时候整体通行是正常的…