Python3如何使用多執行緒公升程式執行速度

2022-09-26 10:21:17 字數 4233 閱讀 7461

優化前後新老**如下:

from git_tools.git_tool import get_collect_projects, qqnews_git

from threading import thread, lock

import datetime

base_url = ""

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" execution 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()

obtksubg@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)

obtksubg 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倍

本文標題: python3如何使用多執行緒公升程式執行速度

本文位址:

python3 基本使用多執行緒

coding utf 8 import threading 進口threading from time import sleep import time def task1 print task 1 executed.sleep 1 def task2 print task 2 executed.s...

python3 多執行緒的使用

示例1 import threading from time import sleep class forthread threading.thread def init self,event threading.thread.init self self.name 我的多執行緒 self.even...

Python3多執行緒

學習python執行緒 python3 執行緒中常用的兩個模組為 thread threading 推薦使用 thread 模組已被廢棄。使用者可以使用 threading 模組代替。所以,在 python3 中不能再使用 thread 模組。為了相容性,python3 將 thread 重新命名為...