博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程池以及futures python新的线程包
阅读量:4984 次
发布时间:2019-06-12

本文共 2884 字,大约阅读时间需要 9 分钟。

from concurrent.futures import ThreadPoolExecutorimport timedef sayh(pus):    print("name: "+pus)    time.sleep(2)def main():    put_list=["恩恩","嗯嗯","(⊙o⊙)嗯"]    start1=time.time()    for pus in put_list:        sayhello(pus)    end1=time.time()    print("循环执行时间: "+str(end1-start1))# concurrent.futures.ThreadPoolExecutor,在提交任务的时候,有两种方式,一种是submit()函数,另一种是map()函数,两者的主要区别在于: #1、map可以保证输出的顺序, submit输出的顺序是乱的     start2=time.time()    with ThreadPoolExecutor(3) as executor:        for pus in put_list:            executor.submit(sayhello,pus)    end2=time.time()    print("submit执行的时间: "+str(end2-start2)) #2、如果你要提交的任务的函数是一样的,就可以简化成map。但是假如提交的任务函数是不一样的,或者执行的过程之可能出现异常(使用map执行过程中发现问题会直接抛出错误)就要用到submit()    start3=time.time()    with ThreadPoolExecutor(3) as executor1:        executor1.map(sayh,pus)    end3=time.time()    print("map执行的时间: "+str(end3-start3))if __name__ == '__main__':    main() 3、submit和map的参数是不同的,submit每次都需要提交一个目标函数和对应的参数,map只需要提交一次目标函数,目标函数的参数放在一个迭代器(列表,字典)里就可以。

 

多线程池思路:     1.创建一个 Queue.Queue() 的实例,然后使用数据对它进行填充。     2.将经过填充数据的实例传递给线程类,后者是通过继承 threading.Thread 的方式创建的。     3.生成守护线程池。     4.每次从队列中取出一个项目,并使用该线程中的数据和 run 方法以执行相应的工作。     5.在完成这项工作之后,使用 queue.task_done() 函数向任务已经完成的队列发送一个信号。     6.对队列执行 join 操作
import threadingimport timefrom queue import Queueclass WorkManager(object):    def __init__(self, work_num,thread_num=2):        self.work_queue = Queue()        self.threads = []        self.Initialize_the_work_queue(work_num)        self.Initialize_the_thread_pool(thread_num)    # 初始化线程    def Initialize_the_thread_pool(self,thread_num):        for i in range(thread_num):    # 调用work类去初始话线程            self.threads.append(InitializeThe(self.work_queue))    # 初始化工作队列    def Initialize_the_work_queue(self, jobs_num):        for args in jobs_num:            # args 任务的参数            self.add_job(do_job, args)    # 添加一项工作入队    def add_job(self, func, *args):        # 任务入队        self.work_queue.put((func, args))    # 等待所有线程运行完毕    def wait_allcomplete(self):        for item in self.threads:            if item.isAlive(): # 判断线程是否属于存活状态                item.join()class InitializeThe(threading.Thread):    def __init__(self, work_queue):        threading.Thread.__init__(self)        self.work_queue = work_queue        self.start()    def run(self):        # 让创建的线程在一定条件下关闭退出        while True:            try:                # 任务异步出队                do, args = self.work_queue.get(block=False)                do(args)                self.work_queue.task_done()# 通知系统任务完成            except:                break# 具体要做的任务def do_job(args):    # 模拟处理时间    time.sleep(0.1)    # 可以拿到参数 args=(1,)    print(threading.current_thread(), args)if __name__ == '__main__':    work_num = [work_num for work_num in range(1,1000)]    work_manager = WorkManager(work_num, 10)    work_manager.wait_allcomplete()

 

转载于:https://www.cnblogs.com/ArtisticMonk/p/10249348.html

你可能感兴趣的文章