Python 简单并发的代码记录

简单介绍

近期想优化一下API的请求,顺带测试一下并发编程能快多少,用到进程、线程,顺带保留一些直接可用的简单的并发代码,方便后期复制粘贴

1、urllib3 网络请求
2、获取函数执行时间(大致的)
3、进程的简单实现
4、线程的简单实现
5、通过CPU计算以及网络IO请求,简单的对比性能上的差异

公共代码

from datetime import datetime
import urllib3
import jsonmanager  = urllib3.PoolManager(num_pools=5)def request_api(site):# print(site)test_url = 'http://127.0.0.1:9000/'r = manager.request('GET', test_url)data = r.data# json.loads(data)return datadef cpu_test(number):result = 235 * numberreturn resultdef print_time(func1, func2):start_time = datetime.now()func1(func2)end_time = datetime.now()print(func1, end_time-start_time)

线程测试 适合 IO密集型:读写

from concurrent.futures import ThreadPoolExecutordef thread_map_test(func):result = []site_list = range(1000)with ThreadPoolExecutor(max_workers=12) as executor:# 返回结果是一个迭代器ans = executor.map(func, site_list)for res in ans:result.append(res)return resultdef thread_test(func):result = []site_list = range(1000)with ThreadPoolExecutor(max_workers=5) as executor:ans = [executor.submit(func, i) for i in site_list ]# as_completed(ans)for res in ans:result.append(res.result())

进程测试 适合CPU密集型:计算

import multiprocessingdef process_by_map(func):data_list = range(1000)with multiprocessing.Pool(processes=4) as pool: result = pool.map(func, data_list)return result # 会阻塞
def process_by_apply(func):result = []data_list = range(1000)with multiprocessing.Pool(processes=4) as pool: for line in data_list:result.append(pool.apply(func, (line,)))return result# 异步非阻塞
def process_by_apply_async(func):result = []data_list = range(1000)with multiprocessing.Pool(processes=4) as pool: for line in data_list:result.append(pool.apply_async(func, (line,)))return result

综合测试

注意:多进程必须要写if name == ‘main’: 否则,IDE上面啥也不提示,但是没执行结果,直接点击执行就会提醒有异常

# 请注意,多进程必须要写if __name__ == '__main__': 
if __name__ == '__main__':print('''计算测试 100万次计算''')# 0:00:00.362031print_time(process_by_map, cpu_test)# 0:01:48.696417print_time(process_by_apply, cpu_test)# 0:00:11.481112print_time(process_by_apply_async, cpu_test)# 0:00:25.352362print_time(thread_map_test, cpu_test)# 0:00:20.073205print_time(thread_test, cpu_test)print('''网络IO 测试  1000次请求''')# 0:00:04.105110print_time(process_by_map, request_api)# 0:00:07.180077print_time(process_by_apply, request_api)# 0:00:00.139999print_time(process_by_apply_async, request_api)# 0:00:02.757811print_time(thread_map_test, request_api)# 0:00:02.712561print_time(thread_test, request_api)

结果

1、网络IO 多线程或者进程的异步请求比较合适
2、CPU计算 多进程性能差异较大,用map应该是有一定的优化的
3、CPU 计算 多进程 map 快于 apply_async 快于 apply
4、网络IO apply_sync 异步 快于 map 快于 apply

其他

1、其他还有锁机制,还未测试
2、对于进程和线程的适用原因,不够清晰,进程上下文切换资源消耗较多,需要找时间了解一下
3、测试方式和写法还不太合理,记得起再优化吧
4、对于并发数,需要自行调整,具体如何科学的得到最优解,暂时也还没有研究,只是简单调试了一下

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

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

相关文章

国产低功耗MCU芯片:Si24R03

Si24R03集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块,是一款高度集成的低功耗SOC片。 应用领域: 1、物联网 2、智N门锁 3、电机控制 4、消费电子 5、工业控制 其无线收发器模块是专为低功耗无线场合设计,在关…

maven聚合和继承

一、什么是maven的聚合和继承&why 随着技术飞速发展,各类用户对软件的要求越来越高,软件也变得越来越复杂。 软件设计人员往往会采用各种方式对软件划分模块,已得到更加清晰的设计及更高的复用性。 当把Maven应用到实际项目中的时候&am…

CCF ChinaSoft 2023 论坛巡礼|形式验证@EDA论坛

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

uni-app:实现当前时间的获取,并且根据当前时间判断所在时间段为早上,下午还是晚上

效果图 核心代码 获取当前时间 toString()方法将数字转换为字符串 padStart(2, 0):padStart()方法用于在字符串头部填充指定的字符,使其达到指定的长度。该方法接受两个参数:第一个参数为期望得到的字符串长度,第二个参数为要填充…

pytorch教程

文章目录 1 pytorch的安装2 PyTorch基础知识2.1 张量简介2.2 初始化2.3 张量的属性2.4 ndarray与tensor互转2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置 3 pytorch自动微分4 线性回归5 分类5.1 写法一5.2 写法二 1 pytorch的安装 pytorch官网 https://pytorch.org/get-…

【C++程序员必修第一课】C++基础课程-12:std::array 固定数组

1 本课主要内容&#xff1a; std::array 固定数组的声明基本使用&#xff1a;赋值、访问数组、遍历等 2 主要知识点&#xff1a; std::array 固定数组的声明 #include <array>// std::array 固定数组例子 std::array<int, 5> array1; // 未…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述&#xff1a; 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能&#xff0c;支持5G终端的产线高速校准及终端发射机…

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的&#xff0c;在设计的时候&#xff0c;只要能做到比较好的抽象&#xff0c;这两部的实现…

Linux高性能服务器编程——ch5笔记

第5章 Linux网络编程基础API 5.1 socket地址API 主机字节序&#xff08;小端字节序&#xff09;&#xff1a;整数的高位字节存储在内存的高地址处&#xff0c;而低位字节则存储在内存的低地址处。 网络字节序&#xff08;大端字节序&#xff09;&#xff1a;相反。 void byt…

全光谱护眼灯有哪些?2023全光谱护眼台灯推荐

随着电子设备的不断普及&#xff0c;手机、平板电脑、显示器、电视机等几乎是家家户户的必备品&#xff0c;也正因为眼睛有那么多时间、那么多机会去盯着屏幕&#xff0c;所以如今近视低龄化现象也越来越严重了。随着科技的不断发展&#xff0c;台灯的发展也越来越多样化&#…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单&#xff0c;还需要注意一些重要的事情。开抖音店铺需要注意以下几点&#xff1a; 1、开抖音店铺有哪些注意事项&#xff1f; 合规管理&#xff1a;在抖音开店&#xff0c;首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

关于yield你只需要知道这2点

1.yield是放在函数里面的&#xff0c;且带有yield的函数就叫做生成器&#xff0c;这时函数就成了一个对象&#xff0c;而不能把它作为函数来对待 def foo(num):print("introduction:")while:if num < 10:num 1yield num g foo()看上面的代码&#xff0c;我们把…

Python 基础问题

文章目录 python 中有哪些类型或数据结构什么是有序和无序什么是可变和不可变字典中&#xff0c;什么类型可以当做key去使用闭包是什么装饰器是什么 python 中有哪些类型或数据结构 在 Python 中&#xff0c;有多种类型和数据结构可用于存储和组织数据。以下是一些常见的类型和…

golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)

logrus 介绍一个golang 日志框架logrus 支持文本与JSON数据格式支持结构化记录支持hook 文档介绍 logrus文档 std 官方案例介绍了如何配置std打印 package mainimport ("os"log "github.com/sirupsen/logrus" )func init() {// Log as JSON instead…

Unoconv入门介绍和问题汇总

简介&#xff1a;Unoconv是一款基于LibreOffice/ Openoffice开发的命令行工具&#xff0c;可以将不同格式的文件&#xff08;如DOC、PPT、PDF等&#xff09;在不同的操作系统上通过Libreoffice/Openoffice转换为PDF、ODT、DOC、PNG、PPTX等格式&#xff0c;并支持在命令行中指定…

Elasticsearch学习笔记

1.核心概念 bucket: 一个数据分组&#xff08;类似于sql group by以后的数据&#xff09;metric&#xff1a;对bucket执行的某种聚合分析的操作&#xff0c;比如说求平均值&#xff0c;最大值&#xff0c;最小值。一些系列的统计方法(类似 select count(1) MAX MIN AVG) 请…

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值&#xff0c;代表了一种错误信息&#xff1b;只有返回cudaSuccess时&#xff0c;才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…

【lesson13】进程控制初识

文章目录 进程创建 进程创建 请你描述一下&#xff0c;fork创建子进程操作系统都做了什么&#xff1f; fork创建子进程&#xff0c;系统里多了一个进程&#xff0c;进程 内核数据结构 进程代码数据&#xff0c;内核数据结构由OS维护&#xff0c;进程代码数据一般由磁盘维护。…

位运算相关笔记

位运算 Part 1&#xff1a;基础 左移&#xff1a;左移一位&#xff0c;相当于某数乘以 2 2 2。左移 x x x位,相当于该数乘以 2 x 2^x 2x。 右移&#xff1a;右移一位&#xff0c;相当于某数除以 2 2 2。右移 x x x位&#xff0c;相当于该数除以 2 x 2^x 2x。 与运算&…

【Edabit 算法 ★☆☆☆☆☆】【分钟转秒数】Convert Minutes into Seconds

【Edabit 算法 ★☆☆☆☆☆】【分钟转秒数】Convert Minutes into Seconds math numbers Instructions Write a function that takes an integer minutes and converts it to seconds. Examples convert(5) // 300 convert(3) // 180 convert(2) // 120Notes Don’t forge…