from multiprocessing.dummy import Pool executor = Pool(10) # 构造线程池 executor.map() executor.apply_async() from concurrent.futures import ThreadPoolExecutor threadPool = ThreadPoolExecutor(max_workers=10) threadPool.submit() from multiprocessing.pool import Pool executor = Pool(200) # 构造进程池 executor.apply_async() from concurrent.futures import ProcessPoolExecutor with ProcessPoolExecutor(max_workers=5) as pool: pool.map()进程池技术创建任务列表
def all_precept(self): # 获取所有方案 返回值[接口1,……,接口n]
result = Publie().read_hive_planid(rq)
port_list = []
pool = Pool(200)
res = []
for program_list in result:
res.append(pool.apply_async(self.load_plan, args=(program_list,)))
pool.close()
pool.join()
for i in res:
i.wait()
for r in res:
port_list.append(r.get())
return port_list
def load_plan(self, program_list):
render_id = program_list[1]
basic_id = program_list[0]
str1 = 'http://offline.decoration.api.realsee.com/vr/display/detail.json?type=decoration&basic_id='
str2 = '&render_id='
str1 += str(basic_id)
str2 += str(render_id)
url = str1 + str2
data = requests.get(url=url).text
new_data = json.loads(data)
try:
floorplan = new_data["data"]["decoration"]['file_map']['floorplan.json']
config = new_data["data"]["decoration"]['file_map']['config.json']
if floorplan == True and config == True:
floorplan_url = new_data["data"]["decoration"]['prefix_path'] + 'floorplan.json'
config_url = new_data["data"]["decoration"]['prefix_path'] + 'config.json'
floorplan_json = requests.get(url=floorplan_url).text
config_json = requests.get(url=config_url).text
planid = basic_id
workid = program_list[2]
taskid = program_list[3]
my_list = [planid, floorplan_json, config_json, workid, taskid] # 每套方案的floorplan,config
return my_list
except Exception as e:
# print('方案报错信息:' + f" 33[31m{e} 33[0m".format(e)) # 标注为红色
pass
构造任务列表
def all_precept(self): # 获取所有方案 返回值[接口1,……,接口n]
result = Publie().read_hive_planid(rq)
port_list = []
for program_list in result:
render_id = program_list[1]
basic_id = program_list[0]
str1 = 'http://offline.decoration.api.realsee.com/vr/display/detail.json?type=decoration&basic_id='
str2 = '&render_id='
str1 += str(basic_id)
str2 += str(render_id)
url = str1 + str2
data = requests.get(url=url).text
new_data = json.loads(data)
try:
floorplan = new_data["data"]["decoration"]['file_map']['floorplan.json']
config = new_data["data"]["decoration"]['file_map']['config.json']
if floorplan == True and config == True:
floorplan_url = new_data["data"]["decoration"]['prefix_path'] + 'floorplan.json'
config_url = new_data["data"]["decoration"]['prefix_path'] + 'config.json'
floorplan_json = requests.get(url=floorplan_url).text
config_json = requests.get(url=config_url).text
planid = basic_id
workid = program_list[2]
taskid = program_list[3]
my_list = [planid,floorplan_json,config_json,workid,taskid] # 每套方案的floorplan,config
port_list.append(my_list)
except Exception as e:
# print('方案报错信息:' + f" 33[31m{e} 33[0m".format(e)) # 标注为红色
pass
return port_list
多线程一定比单线程快吗?
多线程存在上下文切换
上下文切换:
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换会这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。



