• 使用池


    什么是池?

    • 在程序开始时, 还没有提交任务,先创建几个线程或进程, 并放在一个池子里, 这就是池.

    为什么要用池?

    • 先开好线程/进程, 等有任务之后就可以直接使用这个池中的数据

    • 开好的线程/进程会一直存在于这个池中, 可以被多个任务反复利用, 从而能够减少开启 关闭 调度线程/进程的时间开销

    • 池中线程/进程的个数控制操作系统需要调度任务的个数, 控制池中的单位, 这样有利于提高提高操作系统的效率, 减轻操作系统的负担

    python中相关模块的发展过程

    • threading模块, 没有提供池
    • multiprocessing模块, 仿照threading模块写的, 但是提供了Pool
    • concurrent.futures模块, 提供了线程池ThreadPoolExecutor和进程池ProcessPoolExecutor, 并且能够用相似的方式开始和使用

    代码示例

    from concurrent.futures import ThreadPoolExecutor
    from threading import current_thread
    import time
    
    
    def func(n):
        print(n, current_thread().ident, 'start')
        time.sleep(1)
        print(n, current_thread().ident, 'end')
        return n*n
    
    
    def print_fun(res):
        print(res.result())
    
    
    if __name__ == '__main__':
        # 创建线程池
        tp = ThreadPoolExecutor(4)
    
        for i in range(20):                     # 异步非阻塞
            # 提交任务到线程池
            ret = tp.submit(func, i)            # Future未来对象
    
            # 回调函数, 异步阻塞, 给ret对象绑定一个回调函数, 等待ret对应的任务完成之后立即调用print_fun函数
            # 实现对结果的立即处理, 不用按照顺序接受处理
            ret.add_done_callback(print_fun)
    
  • 相关阅读:
    LeetCode --- Roman to Integer
    LeetCode --- Maximum Depth of Binary Tree
    LeetCode --- Minimum Path Sum
    Hashkell 第一篇
    LeetCode --- Partition List
    LeetCode --- Valid Palindrome
    LeetCode --- Longest Consecutive Sequence
    LeetCode --- Insertion Sort List
    数据库lib7第2, 3题(创建索引和触发器)
    LeetCode --- Reverse Integer
  • 原文地址:https://www.cnblogs.com/KX-Lau/p/13576775.html
Copyright © 2020-2023  润新知