• 进程池线程池


    什么是池

    在介绍进程池和线程池之前,我们需要对其原理有一个了解。总所周知,进程和线程都是不可被重复利用的,在实现高并发中,这会极大的浪费资源。所以首先我们应该想办法实现线程和进程的可重复利用,而生产者与消费者模式就可以很好地解决这个问题。当我们需要开启多个线程或进程时,难道只能一个个去开吗?这时我们可以开辟一个进程池或线程池,可以一次就开启多个进程或线程,池的简单实现也可以用生产者与消费者模式来实现。

    相对于池而言,进程与线程基本上没有区别:在OOP编程中,对象的构造与析构是一个较为复杂的过程,时间消耗较大,为了提高程序的运行效率,要尽可能减少构造和析构的次数。

    因此我们要预先存放一些进程或线程到池,用时在池中取,用完归回给池,免去了创建、删除进程的开销。

    为什么要用池?

    # 如果先开好进程/线程,那么有任务之后就可以直接使用这个池中的数据了
    # 并且开好的线程或者进程会一直存在在池中 处理完毕进程并不关闭,可以被多个任务反复利用
         # 这样极大的减少了开启关闭调度线程/进程的时间开销
    # 池中的线程/进程个数控制了操作系统需要调度的任务个数,控制池中的单位
            # 有利于提高操作系统的效率,减轻操作系统的负担
    

    开启一个池

    from django.shortcuts import render
    
    # Create your views here.
    
    from concurrent.futures import ProcessPoolExecutor#引用的模块
    from concurrent.futures import ThreadPoolExecutor
    import time
    import os
    import random
    
    def task(name):
        print(name)
        print(f'{os.getpid()} 准备接客')
        time.sleep(random.randint(1,3))
    
    if __name__ == '__main__':
    
        p = ProcessPoolExecutor()  # 线程默认cup数*5 ,进程cup数
        # p = ThreadPoolExecutor()  # 线程默认cup数*5 ,进程cup数
        for i in range(20):
            p.submit(task,1)  # 给进程池放任务,传参
    

    最佳线程数的获取

    https://www.cnblogs.com/igubai/p/7426157.html

    1、通过用户慢慢递增来进行性能压测,观察QPS(即每秒的响应请求数,也即是最大吞吐能力。),响应时间

    2、根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量

    3、单用户压测,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量。

  • 相关阅读:
    二维数组排序
    php-快速排序
    sql优化相关
    全页面静态化缓存
    php--1-100相加之和
    php--阶乘
    socket
    posix_getpid 函数win下失效问题
    水仙花数
    常用的魔术方法
  • 原文地址:https://www.cnblogs.com/saoqiang/p/12388494.html
Copyright © 2020-2023  润新知