python之自定义线程池,拿回调结果
1.排队执行程序比较慢?我们就会想到用线程去执行,
如果我们需要拿到每一个线程的返回结果呢?
2.下面内容分为三部分 其中定义一个关键字Key
2.1 任务方法:我们需要返回{key:xxxxxxxx}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def start_fun(**kwargs): time.sleep(random.randint(1,5)) print(f"前来执行函数:{kwargs}") # 我在这里肯定可以拿到server_id, # 返回 {“1111”:{”status“:成功}} server_id = kwargs.get("key") response_data = {} response_data[server_id] = "成功啦" print(f"返回值:{server_id}") return response_data
2.2自定义线程池:拿到key然后存起来,待会做比较用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class CustomThreadPool(): # 我要定义一个 def __init__(self, key="server_id"): self.response_dic = {} self.key = key self.tpool = ThreadPoolExecutor(10) self.key_list = [] # 用来做判断的 def do(self, **kwargs): # fun = fun fun = kwargs.get("fun") print(f"fun:{fun}") key = kwargs.get("key") # 先把这个加进去 self.key_list.append(key) # 剩下的就是他需要的参数 都给他怼进去 self.tpool.submit(fun, **kwargs).add_done_callback(self._call_back_fun) def _call_back_fun(self, data): response_data = data.result() # key = response_data.get(self.key) # self.response_dic[key] = response_data # 直接更新字典就好啦 # 我这里不用管 self.response_dic.update(response_data) def get_response_data(self): # 这里做一个判断,如果怎么样就返回,如果拿啥就堵塞 while True: key_list_len = len(self.key_list) response_dic_keys_len = len(self.response_dic.keys()) # print(self.response_dic.keys(),self.key_list) if key_list_len == response_dic_keys_len: return self.response_dic
2.3调用线程池:需要传参key
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def main(): custom_pool = CustomThreadPool() for i in range(10): kwargs = { "key": i, "fun": start_fun } custom_pool.do(**kwargs) return custom_pool.get_response_data()
3.效果图:会等结果出来,再往下执行(待优化,加上超时吧,等待多久就死掉)
-----------------------------------------------------------------------------------------------------------------------------------------