• 线程池_进程池


    转载

    一只小小的寄居蟹

    一个为什么要有进程池?进程池的概念。

    在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗时间,销毁进程也需要消耗时间。第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?

    在这里,要给大家介绍一个进程池的概念,定义一个池子,在里面放上固定数量的进程,有需求来了,就拿一个池中的进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。如果有很多任务需要执行,池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果

    自带线程 1、

      

    # pool.map(worker,msg_list) 

    from multiprocessing.pool import ThreadPool   #线程池
    from multiprocessing import Pool #进程池
    import random
    import time


    #IO密集型
    def worker(msg):
    time.sleep(2)
    print(msg)


    msg_list = [1,2,3,4,5,6,7,8,9]


    pool = ThreadPool(4) #实现一个线程池 ,参数是线程的数量
    pool.map(worker,msg_list) #map方法会把序列里面的元素 一个一个的传入前面的方法 这个msg_list里面可以装任何东西 比如url
    #因为上面是4个线程, 所以会4个一起执行,1、sleep 2秒 2、打印1234 3、sleep 2秒 4、打印5678
    '''
    打印下面的
    4
    2
    3
    1
    停顿2秒
    6
    5
    7
    8
    停顿2秒
    9

    '''

     ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    #
    pool.apply_async(worker)  线程方法


    from multiprocessing.pool import ThreadPool #线程池
    from multiprocessing import Pool #进程池
    import random
    import time

    start_time = time.time()
    #IO密集型
    def worker():
    print("111111")

    pool = ThreadPool(2) #实现一个线程池 ,参数是线程的数量
    pool.apply_async(worker)
    pool.apply_async(worker)
    pool.apply_async(worker)
    pool.apply_async(worker)
    #没有打印是因为主线程已经结束, 如果要打印就需要加阻塞, 等待打印
    pool.close() #关闭线程池, 不在提交任务,
    pool.join() #等待线程池里面的任务 运行完毕
    print(time.time() - start_time)




    -----------------------------------------------------------------------------------------------------------------------------------------------

    #自己写单线程池
    import threading
    import queue

    class MyThread(threading.Thread): #继承线程类

    def __init__(self):
    super().__init__() #2、对父类进行初始化的过程
    self.queue = queue.Queue()
    #self.daemon = True #随着主线程一起退出 (守护线程)
    self.start() #3、开启线程
    #4、这是一个简单的方法, 只要上面的初始化运行了, 下面就开始运行
    def run(self): #这只是一个线程run方法, 、让他始终去运行、去获取queue里面的任务、然后给任务分配函数去执行(获取任务在执行)
    while True: #5、让他始终去运行
    func,args,kwargs = self.queue.get() #8、去获取queue里面的任务 (这个地方涉及到万能传参args,kwarsg,所以要用func,args,kwargs))
    func(*args,**kwargs) #9、然后给任务分配函数去执行
    self.queue.task_done() #计数器 执行完这个任务后 (队列-1操作)

    def apply_async(self,func,args = (),kwargs = {}): #7、这个是给队列(queue) 放任务的函数 (接受任务)
    self.queue.put((func,args,kwargs)) #给了放(put)一个任务 (放任务的时候, 有时候不可能只有一个参数, 有好几个)


    def join(self, timeout=None):
    self.queue.join() #等待队列里面的任务处理完毕 self.queue.task_done()这句会让queue.join实现不阻塞

    def func1(): #**********************重点10、 10.1、 10.2 一起作为线程运行的函数, 也就是消费者***************************
    print("func1")

    def func2(): #10.1
    print("func2")

    def func3(): #10.2
    print("func3")

    t = MyThread() # 1、实例了一个线程对象
    t.apply_async(func1) #6、生产者, 开始给队列里面放东西
    t.apply_async(func2)
    t.apply_async(func3)
    t.join()
    print("处理完毕")
  • 相关阅读:
    第一周学习总结
    lhgdialog窗口插件
    validate验证
    jxl自己写的例子
    jxl导入/导出excel
    struts2文件上传
    struts2基于注解的文件下载
    学校操场的印象
    我的开源项目:JPEG分析器
    我的开源项目:TS封装格式分析器
  • 原文地址:https://www.cnblogs.com/yuanjia8888/p/8690786.html
Copyright © 2020-2023  润新知