业务需求: 使用多进程执行业务代码提高系统效率,但要能够获取并汇总每个子进程的运行结果
示例:获取一批git项目的分支列表
import os
import multiprocessing
from multiprocessing import Manager
import auto_arrange.arrange as arrange_lib
local_root_directory = '/root/auto_arrange_env/'
def get_local_app_directory(app_module, git_directory):
"""获取本地应用所在路径"""
if (app_module == '') or (git_directory == ''):
return local_root_directory
else:
return local_root_directory + app_module + git_directory
def check_git_pull_result_failed(result):
line_list = result.readlines()
for i in range(0, len(line_list)):
if line_list[i].find('error') >= 0:
return True
return False
def git_clone_app(app_module, git_url, local_branch_tag=''):
"""从git上克隆指定应用到本地路径"""
if (app_module == '') or (git_url == ''):
return
local_app_directory = local_root_directory + app_module + '/'
os.system('rm -rf ' + local_app_directory)
if (local_branch_tag == '') or (local_branch_tag == 'master'):
os.system('git clone ' + git_url + ' ' + local_app_directory)
else:
os.system('git clone -b ' + local_branch_tag + ' ' + git_url + ' ' + local_app_directory)
def pull_git_latest_info(app_module, app_git_url):
"""拉取git上最新代码"""
local_app_directory = get_local_app_directory(app_module, '/')
if os.path.exists(local_app_directory):
result = os.popen('cd ' + local_app_directory + '\n' + 'git pull --force')
if check_git_pull_result_failed(result):
git_clone_app(app_module, app_git_url)
result.close()
else:
git_clone_app(app_module, app_git_url)
def get_git_url_branch_list(app_module):
"""获取git分支列表"""
local_app_directory = get_local_app_directory(app_module, '/')
os.system('cd ' + local_app_directory + '\n git remote update origin --prune')
f = os.popen('cd ' + local_app_directory + '\n git branch -r')
branch_list = f.readlines()
default_branch_index = None
for i in range(0, len(branch_list)):
if branch_list[i].find('origin/HEAD') >= 0:
default_branch_index = i
else:
branch_list[i] = branch_list[i].replace('\n', '').replace(' ', '')
if default_branch_index is not None:
branch_list.pop(default_branch_index)
f.close()
return branch_list
def get_git_url_tag_list(app_module):
"""获取git上的tag列表"""
local_app_directory = get_local_app_directory(app_module, '/')
f = os.popen('cd ' + local_app_directory + '\n git tag')
tag_list = f.readlines()
for i in range(0, len(tag_list)):
tag_list[i] = 'tag/' + tag_list[i].replace('\n', '')
f.close()
return tag_list
def worker(app_module_dict, return_dict):
'''消费函数'''
app_module = app_module_dict['app_module']
app_git_url = app_module_dict['app_git_url']
pull_git_latest_info(app_module, app_git_url)
branch_list = get_git_url_branch_list(app_module)
tag_list = get_git_url_tag_list(app_module)
for i in range(0, len(tag_list)):
branch_list.append(tag_list[i])
if len(branch_list) == 0:
branch_list.append('origin/master')
return_dict[app_module] = branch_list
if __name__ == '__main__':
app_module_list = [
{"app_module": "AAA", "app_git_url": "git@192.168.1.1:dev/AAA.git"},
{"app_module": "BBB", "app_git_url": "git@192.168.1.1:dev/BBB.git"},
{"app_module": "CCC", "app_git_url": "git@192.168.1.1:dev/CCC.git"},
{"app_module": "DDD", "app_git_url": "git@192.168.1.1:dev/DDD.git"},
{"app_module": "EEE", "app_git_url": "git@192.168.1.1:dev/EEE.git"},
]
manager = Manager()
return_dict = manager.dict()
jobs = []
for app_module in app_module_list:
p = multiprocessing.Process(target=worker, args=(app_module, return_dict))
jobs.append(p)
p.start()
for proc in jobs:
proc.join()
result_dict = dict(return_dict)
print(result_dict)