如何使用python多线程_Python3如何使用多线程升程序运行速度
优化前后新老代码如下:
from git_tools.git_tool import get_collect_projects, QQNews_Git
from threading import Thread, Lock
import datetime
base_url = "http://git.xx.com"
project_members_commits_lang_info = {}
lock = Lock()
threads = []
'''
Author:zenkilan
'''
def count_time(func):
def took_up_time(*args, **kwargs):
start_time = datetime.datetime.now()
ret = func(*args, **kwargs)
end_time = datetime.datetime.now()
took_up_time = (end_time - start_time).total_seconds()
print(f"{func.__name__} execution took up time:{took_up_time}")
return ret
return took_up_time
def get_project_member_lang_code_lines(git, member, begin_date, end_date):
global project_members_commits_lang_info
global lock
member_name = member["username"]
r = git.get_user_info(member_name)
if not r["id"]:
return
user_commits_lang_info = git.get_commits_user_lang_diff_between(r["id"], begin_date, end_date)
if len(user_commits_lang_info) == 0:
return
lock.acquire()
project_members_commits_lang_info.setdefault(git.project, dict())
project_members_commits_lang_info[git.project][member_name] = user_commits_lang_info
lock.release()
def get_project_lang_code_lines(project, begin_date, end_date):
global threads
git = QQNews_Git(project[1], base_url, project[0])
project_members = git.get_project_members()
if len(project_members) == 0:
return
for member in project_members:
thread = Thread(target=get_project_member_lang_code_lines, args=(git, member, begin_date, end_date))
threads.append(thread)
thread.start()
@count_time
def get_projects_lang_code_lines(begin_date, end_date):
"""
获取项目代码行语言相关统计——新方法(提升效率)
应用多线程替代for循环
并发访问共享外部资源
:return:
"""
global project_members_commits_lang_info
global threads
for project in get_collect_projects():
thread = Thread(target=get_project_lang_code_lines, args=(project, begin_date, end_date))
threads.append(thread)
thread.start()
@count_time
def get_projects_lang_code_lines_old(begin_date, end_date):
"""
获取项目代码行语言相关统计——老方法(耗时严重)
使用最基本的思路进行编程
双层for循环嵌套并且每层都包含耗时操作
:return:
"""
project_members_commits_lang_info = {}
for project in get_collect_projects():
git = QQNews_Git(project[1], base_url, project[0])
project_members = git.get_project_members()
user_commits_lang_info_dict = {}
if len(project_members) == 0:
continue
for member in project_members:
member_name = member["username"]
r = git.get_user_info(member_name, debug=False)
if not r["id"]:
continue
try:
user_commits_lang_info = git.get_commits_user_lang_diff_between(r["id"], begin_date, end_date)
if len(user_commits_lang_info) == 0:
continue
user_commits_lang_info_dict[member_name] = user_commits_lang_info
project_members_commits_lang_info[git.project] = user_commits_lang_info_dict
except:
pass
return project_members_commits_lang_info
def test_results_equal(resultA, resultB):
"""
测试方法
:param resultA:
:param resultB:
:return:
"""
print(resultA)
print(resultB)
assert len(str(resultA)) == len(str(resultB))
if __name__ == '__main__':
from git_tools.config import begin_date, end_date
get_projects_lang_code_lines(begin_date, end_date)
for t in threads:
t.join()
old_result = get_projects_lang_code_lines_old(begin_date, end_date)
test_results_equal(old_result, project_members_commits_lang_info)
老方法里外层for循环和内层for循环里均存在耗时操作:
1)git.get_project_members()
2)git.get_user_info(member_name, debug=False)
分两步来优化,先里后外或先外后里都行。用多线程替换for循环,并发共享外部资源,加锁避免写冲突。
测试结果通过,函数运行时间装饰器显示(单位秒):
get_projects_lang_code_lines execution took up time:1.85294
get_projects_lang_code_lines_old execution took up time:108.604177
速度提升了约58倍
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
如何使用python多线程_Python3如何使用多线程升程序运行速度相关推荐
- python多线程提高速度_Python3如何使用多线程升程序运行速度
优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from threading import Th ...
- python廖雪峰_【Python】python中实现多进程与多线程
进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...
- python实用程序育儿法_Python多线程 简明例子
Python多线程 简明例子 (2010-03-11 15:15:09) Python多线程 简明例子 综述 多线程是程序设计中的一个重要方面,尤其是在服务器Deamon程序方面.无论何种系统,线程调 ...
- python真正实现多线程的方法_python多线程几种方法实现
匿名用户 1级 2018-05-27 回答 Python进阶(二十六)-多线程实现同步的四种方式 临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能, ...
- python多线程没用_python的多线程到底有没有用?
在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? ...
- python多线程爬虫实例-Python3多线程爬虫实例讲解代码
多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...
- Python 并发编程之使用多线程和多处理器
在Python编码中我们经常讨论的一个方面就是如何优化模拟执行的性能.尽管在考虑量化代码时NumPy.SciPy和pandas在这方面已然非常有用,但在构建事件驱动系统时我们无法有效地使用这些工具.有 ...
- async python两个_【Python】python中实现多进程与多线程
进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...
- python多线程扫描_python实现多线程扫描网站目录
python实现网站目录扫描 st=>start: 程序开始 op=>operation: 打印banner信息 op2=>operation: 打印使用方法 op3=>ope ...
最新文章
- 演示:思科设备基于物理接口帧中继(fame-relay)的配置
- 图像轮廓、凸包、图像的矩、分水岭算法、图像修补
- Http接口开发(自测服务端客户端)
- C# 10 新特性 —— 补充篇
- IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决
- 谈一谈Java 中 1000==1000 为false,而100==100 为true?
- openGauss索引详解
- XLNET:换一个思路做预训练,效果杠杠滴
- 超详细 Spring @RequestMapping 注解使用技巧
- ApowerREC v1.5.6.2 最佳屏幕录像机
- 技术规范,过几天发个压缩包,一次下载全部拥有
- h5页面制作软件html包,iH5专业H5页面制作工具网页版
- 3分钟速读原著《Java数据结构与算法》(一)
- vim写python时:line 1: syntax error near unexpected token
- Java全套课程修炼之Java小白入门篇
- 你不得不知的网络编程三剑客
- CodeForces 1037E Trips(瞎搞)
- 基于MXL90614设计温度传感器
- 【整理】SIMD、MMX、SSE、AVX、3D Now!、neon——指令集大全
- scau csapp复习
热门文章
- 两个精彩的比喻:吞吐量和延迟、信号量和互斥锁
- 老板思维:工作负责人是首问责任制
- c++代码转为go_Go语言学习笔记六--string编码
- Java ResourceBundle getLocale()方法与示例
- python两个中文队列比较_具有两个优先级的优先级队列Python
- tcp 发送 最大数据量_网络基础知识夯实总结(三):TCP协议
- 多选取值_机制砂如何控制MB值和石粉含量
- kotlin 16进制_Kotlin程序将八进制数转换为十进制数
- MySQL中你必须知道的10件事,1.5万字!
- 磊哥私藏书单分享,160买400的书!