Python3如何使用多线程升程序运行速度


Posted in Python onAugust 11, 2020

优化前后新老代码如下:

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 相关文章推荐
跟老齐学Python之从格式化表达式到方法
Sep 28 Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 Python
Python模拟三级菜单效果
Sep 11 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
浅谈Python中的私有变量
Feb 28 Python
TensorFlow利用saver保存和提取参数的实例
Jul 26 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
python 实现体质指数BMI计算
May 26 Python
python 中的@运算符使用
May 26 Python
Python制作一个随机抽奖小工具的实现
Jul 07 Python
使用Python pip怎么升级pip
Aug 11 #Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 #Python
Python 代码调试技巧示例代码
Aug 11 #Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
Aug 11 #Python
Python函数递归调用实现原理实例解析
Aug 11 #Python
零基础学python应该从哪里入手
Aug 11 #Python
Python如何测试stdout输出
Aug 10 #Python
You might like
Linux中为php配置伪静态
2014/12/17 PHP
深入理解PHP类的自动载入机制
2016/09/16 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
2015/06/16 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
AngularJs解决跨域问题案例详解(简单方法)
2016/05/19 Javascript
Centos7 中 Node.js安装简单方法
2016/11/02 Javascript
Vue.js仿Metronic高级表格(二)数据渲染
2017/04/19 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
hammer.js实现图片手势放大效果
2017/08/29 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例
2019/11/13 Javascript
js 计数排序的实现示例(升级版)
2020/01/12 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python随机函数random()使用方法小结
2018/04/29 Python
基于python SMTP实现自动发送邮件教程解析
2020/06/02 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
使用gunicorn部署django项目的问题
2020/12/30 Python
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
暑假实习求职信范文
2013/09/22 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
网页美工求职信范文
2014/04/17 职场文书
三严三实对照检查材料
2014/08/25 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书