优化前后新老代码如下:

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如何使用多线程升程序运行速度相关推荐

  1. python多线程提高速度_Python3如何使用多线程升程序运行速度

    优化前后新老代码如下: from git_tools.git_tool import get_collect_projects, QQNews_Git from threading import Th ...

  2. python廖雪峰_【Python】python中实现多进程与多线程

    进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...

  3. python实用程序育儿法_Python多线程 简明例子

    Python多线程 简明例子 (2010-03-11 15:15:09) Python多线程 简明例子 综述 多线程是程序设计中的一个重要方面,尤其是在服务器Deamon程序方面.无论何种系统,线程调 ...

  4. python真正实现多线程的方法_python多线程几种方法实现

    匿名用户 1级 2018-05-27 回答 Python进阶(二十六)-多线程实现同步的四种方式 临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能, ...

  5. python多线程没用_python的多线程到底有没有用?

    在群里经常听到这样的争执,有人是虚心请教问题,有人就大放厥词因为这个说python辣鸡.而争论的核心无非就是,python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉.这是真的吗? ...

  6. python多线程爬虫实例-Python3多线程爬虫实例讲解代码

    多线程概述 多线程使得程序内部可以分出多个线程来做多件事情,充分利用CPU空闲时间,提升处理效率.python提供了两个模块来实现多线程thread 和threading ,thread 有一些缺点, ...

  7. Python 并发编程之使用多线程和多处理器

    在Python编码中我们经常讨论的一个方面就是如何优化模拟执行的性能.尽管在考虑量化代码时NumPy.SciPy和pandas在这方面已然非常有用,但在构建事件驱动系统时我们无法有效地使用这些工具.有 ...

  8. async python两个_【Python】python中实现多进程与多线程

    进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...

  9. python多线程扫描_python实现多线程扫描网站目录

    python实现网站目录扫描 st=>start: 程序开始 op=>operation: 打印banner信息 op2=>operation: 打印使用方法 op3=>ope ...

最新文章

  1. 演示:思科设备基于物理接口帧中继(fame-relay)的配置
  2. 图像轮廓、凸包、图像的矩、分水岭算法、图像修补
  3. Http接口开发(自测服务端客户端)
  4. C# 10 新特性 —— 补充篇
  5. IntelliJ IDEA 项目结构旁边出现 0%methods,0% lines covered 解决
  6. 谈一谈Java 中 1000==1000 为false,而100==100 为true?
  7. openGauss索引详解
  8. XLNET:换一个思路做预训练,效果杠杠滴
  9. 超详细 Spring @RequestMapping 注解使用技巧
  10. ApowerREC v1.5.6.2 最佳屏幕录像机
  11. 技术规范,过几天发个压缩包,一次下载全部拥有
  12. h5页面制作软件html包,iH5专业H5页面制作工具网页版
  13. 3分钟速读原著《Java数据结构与算法》(一)
  14. vim写python时:line 1: syntax error near unexpected token
  15. Java全套课程修炼之Java小白入门篇
  16. 你不得不知的网络编程三剑客
  17. CodeForces 1037E Trips(瞎搞)
  18. 基于MXL90614设计温度传感器
  19. 【整理】SIMD、MMX、SSE、AVX、3D Now!、neon——指令集大全
  20. scau csapp复习

热门文章

  1. 两个精彩的比喻:吞吐量和延迟、信号量和互斥锁
  2. 老板思维:工作负责人是首问责任制
  3. c++代码转为go_Go语言学习笔记六--string编码
  4. Java ResourceBundle getLocale()方法与示例
  5. python两个中文队列比较_具有两个优先级的优先级队列Python
  6. tcp 发送 最大数据量_网络基础知识夯实总结(三):TCP协议
  7. 多选取值_机制砂如何控制MB值和石粉含量
  8. kotlin 16进制_Kotlin程序将八进制数转换为十进制数
  9. MySQL中你必须知道的10件事,1.5万字!
  10. 磊哥私藏书单分享,160买400的书!