from git_tools.git_tool importget_collect_projects, QQNews_Gitfrom threading importThread, Lockimportdatetime
base_url= "http://git.xx.com"project_members_commits_lang_info={}
lock=Lock()
threads=[]'''Author:zenkilan'''
defcount_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}")returnretreturntook_up_timedefget_project_member_lang_code_lines(git, member, begin_date, end_date):globalproject_members_commits_lang_infogloballock
member_name= member["username"]
r=git.get_user_info(member_name)if not r["id"]:returnuser_commits_lang_info= git.get_commits_user_lang_diff_between(r["id"], begin_date, end_date)if len(user_commits_lang_info) ==0:returnlock.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()defget_project_lang_code_lines(project, begin_date, end_date):globalthreads
git= QQNews_Git(project[1], base_url, project[0])
project_members=git.get_project_members()if len(project_members) ==0:return
for member inproject_members:
thread= Thread(target=get_project_member_lang_code_lines, args=(git, member, begin_date, end_date))
threads.append(thread)
thread.start()
@count_timedefget_projects_lang_code_lines(begin_date, end_date):"""获取项目代码行语言相关统计——新方法(提升效率)
应用多线程替代for循环
并发访问共享外部资源
:return:"""
globalproject_members_commits_lang_infoglobalthreadsfor project inget_collect_projects():
thread= Thread(target=get_project_lang_code_lines, args=(project, begin_date, end_date))
threads.append(thread)
thread.start()
@count_timedefget_projects_lang_code_lines_old(begin_date, end_date):"""获取项目代码行语言相关统计——老方法(耗时严重)
使用最基本的思路进行编程
双层for循环嵌套并且每层都包含耗时操作
:return:"""project_members_commits_lang_info={}for project inget_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 inproject_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:continueuser_commits_lang_info_dict[member_name]=user_commits_lang_info
project_members_commits_lang_info[git.project]=user_commits_lang_info_dictexcept:pass
returnproject_members_commits_lang_infodeftest_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 importbegin_date, end_date
get_projects_lang_code_lines(begin_date, end_date)for t inthreads:
t.join()
old_result=get_projects_lang_code_lines_old(begin_date, end_date)
test_results_equal(old_result, project_members_commits_lang_info)