zoukankan      html  css  js  c++  java
  • 第二十九天

    今日内容

    一、进程池与线程池

    1.1进程池与线程池

    #计算密集型用多进程,因为不能无限开进程所以采用进程池限制开启数量
    #IO密集型用多线程,因为不能无限开启多线程所以采用线程池限制开启数量
    from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
    from threading import current_thread    #查看线程名称
    import os,time,random
    
    def task(n):
        # print("%s is runing" %os.getpid())
        print("%s is runing" %current_thread().name)
        time.sleep(random.randint(1,3))
        return n**2
    
    def handle(futrue):
        res = futrue.result()
        # print("%s 正在处理结果: %s" %(os.getpid(),res))
        print("%s 正在处理结果: %s" %(current_thread().name,res))
        time.sleep(2)
    
    
    if __name__ == '__main__':
        # pool = ProcessPoolExecutor(max_workers=4)  #指定进程池大小
        pool = ThreadPoolExecutor(max_workers=10)    #指定线程池大小
        for i in range(19):
           pool.submit(task,i).add_done_callback(handle) #回调函数
    
        pool.shutdown(wait=True)
    

    二、协程

    2.1协程的概念:单线程下实现的并发

    特点:自己的应用程序实现多个人的调度,从一个任务切换到另一个任务,把单线程下的IO时间缩短到极致
    不是所有的协程都有意义,只有遇到IO才切换的协程才有意义
    
    缺点:
    1、不能实现并行
    2、单线程下的多个任务一旦遇到IO,整个线程都会阻塞,所有任务都停滞
    
    #gevent:会监测IO行为,进行切换并记录状态
    #举例:
    from gevent import monkey;monkey.patch_all()  #会将以下代码IO行为转换为gevent能监测的形式
    import time,gevent
    def eat(name):
        print('%s eat 1' % name)
        time.sleep(2)
        print('%s eat 2' % name)
    
    def play(name):
        print('%s play 1' % name)
        time.sleep(1)
        print('%s play 1' % name)
    
    g1 = gevent.spawn(eat,"egon")
    g2 = gevent.spawn(play,"egon")
    g1.join()
    g2.join()
    print("主")
  • 相关阅读:
    maven上传jar包规范
    java.util.ConcurrentModificationException
    求集合中的最大值和最小值
    对象/集合转换成json
    字符串直接赋值和构造赋值的区别
    CSV文件读取
    读取properties配置文件
    图片轮播 js代码
    工作流数据库字段设计-审批流程。。
    @Html.Partials 加载分布视图传参数
  • 原文地址:https://www.cnblogs.com/kk942260238/p/14426768.html
Copyright © 2011-2022 走看看