进程池与线程池

Event事件

Event事件的作用

用来控制线程的执行,由一些线程去控制另一些线程

进程池与线程池

  1. 什么是进程池与线程池

    进程池与线程池是用来控制当前程序允许创建(进程/线程)的数量

  2. 进程池与线程池的作用

    保证在硬件允许的范围内创建(进程/线程)的数量

  3. 如何使用

    from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
    import time
    
    # ProcessPoolExecutor(5)  # 5代表只能开启5个进程
    # ProcessPoolExecutor()  # 默认以CPU的个数限制进程数
    
    pool = ThreadPoolExecutor(5)  # 5代表只能开启5个线程 -5 +1 -1 +1 -1
    # ThreadPoolExecutor()  # 默认以CPU个数 * 5 限制线程数
    
    # t = Tread()  # 异步提交
    # t.start(0)
    
    
    
    # pool.submit('传函数地址')  # 异步提交任务
    # def task():
    #     print('线程任务开始了...')
    #     time.sleep(1)
    #     print('线程任务结束了...')
    #
    #
    # for line in range(5):
    #     pool.submit(task)
    
    
    # 异步提交任务
    # pool.submit('传函数地址').add_done_callback('回调函数地址')
    def task(res):
        # res == 1
        print('线程任务开始了...')
        time.sleep(1)
        print('线程任务结束了...')
        return 123
    
    
    # 回调函数
    def call_back(res):
        print(type(res))
        # 注意: 赋值操作不要与接收的res同名
        res2 = res.result()
        print(res2)
    
    
    for line in range(5):
        pool.submit(task, 1).add_done_callback(call_back)
    
    
    # 会让所有线程池的任务结束后,才往下执行代码
    # pool.shutdown()
    
    print('hello')
    

协程

  1. 进程:资源单位
  2. 线程:执行单位
  3. 协程:在单线程下实现并发

注意:协程不是操作系统资源,他是程序起的名字,为了让单线程能实现并发

协程的目的

  • 操作系统:

    多道技术,切换+保存状态

    • 遇到IO
    • CPU执行时间过长
  • 协程

    通过手动模拟操作系统“多道技术”,实现 切换+保存状态

    • 手动实现 遇到IO切换,欺骗操作系统误以为没有IO操作
    • 单线程 计算密集型,来回切换+保存状态时,反而效率更低

    优点:

    在IO密集型的情况下,会提高效率

    缺点:

    若在计算密集型的情况下,来回切换,反而效率更低

    如何实现协程:切换+保存状态

    • yield:保存状态
    • 并发:切换
posted @ 2019-10-31 19:45  ^啷个哩个啷$  阅读(177)  评论(0编辑  收藏  举报