python之自定义线程池,拿回调结果

1.排队执行程序比较慢?我们就会想到用线程去执行,

    如果我们需要拿到每一个线程的返回结果呢?

2.下面内容分为三部分  其中定义一个关键字Key

  2.1 任务方法:我们需要返回{key:xxxxxxxx}

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
View Code

 

  2.2自定义线程池:拿到key然后存起来,待会做比较用

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
View Code

 

  2.3调用线程池:需要传参key

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()
View Code

 

 

 

3.效果图:会等结果出来,再往下执行(待优化,加上超时吧,等待多久就死掉)

 

posted @ 2022-10-09 11:57    阅读(61)  评论(0编辑  收藏  举报