• python3 进程池和线程池


    进程池的使用实例

    import time
    from concurrent.futures import ProcessPoolExecutor
    
    
    def func(name):
        print(f"{name}开始")
        time.sleep(0.5)
        print(f"{name}结束")
    
    
    if __name__ == '__main__':
        p = ProcessPoolExecutor(max_workers=3)  # 创建一个进程池
        for i in range(1, 10):
            p.submit(func, f"进程{i}")  # 往进程池内提交任务
    
        p.shutdown()  # 主进程等待子进程结束
        print("主进程结束")

    执行结果:

    进程1开始
    进程2开始
    进程3开始
    进程1结束
    进程4开始
    进程2结束
    进程5开始
    进程3结束
    进程6开始
    进程4结束
    进程7开始
    进程5结束
    进程8开始
    进程6结束
    进程9开始
    进程7结束
    进程8结束
    进程9结束
    主进程结束

    创建一个进程池,进程池里有3个进程同时在执行任务,哪个进程执行完了,会自动执行下一个任务,相当于原来是一个人干活,现在是3个人一起干活,速度会提高很多。

    线程池的使用实例

    import time
    from concurrent.futures import ThreadPoolExecutor
    
    
    def func(name):
        print(f"{name}开始")
        time.sleep(0.5)
        print(f"{name}结束")
    
    
    if __name__ == '__main__':
        p = ThreadPoolExecutor(max_workers=3)  # 创建一个线程池,里面最多有3个线程同时工作
        for i in range(1, 10):
            p.submit(func, f"线程{i}")
        p.shutdown()  # 主线程等待子线程结束
        print("主线程结束")

    执行结果:

    线程1开始
    线程2开始
    线程3开始
    线程3结束
    线程1结束
    线程2结束
    线程4开始
    线程5开始
    线程6开始
    线程5结束
    线程4结束
    线程6结束
    线程7开始
    线程8开始
    线程9开始
    线程7结束
    线程8结束
    线程9结束
    主线程结束

    创建一个线程池,线程池里有3个线程同时在执行任务,哪个线程执行完了,会自动执行下一个任务,相当于原来是一个人干活,现在是3个人一起干活,速度会提高很多。

    对比看下线程池和进程池(用法完全一样)

    import os
    import time
    from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
    import threading
    import random
    
    
    def f(n):
        time.sleep(random.randint(1, 3))
        # print(n)
        # print("进程(%s) %s的平方: %s" % (os.getpid(), n, n*n))
        print("线程(%s) %s的平方: %s" % (threading.current_thread().getName(), n, n * n))
        return n * n
    
    
    if __name__ == '__main__':
    
        pool = ThreadPoolExecutor(max_workers=5)
        # pool = ProcessPoolExecutor(max_workers=5)
        ret_list = []
        for i in range(10):
            ret = pool.submit(f, i)  # 异步提交任务,f函数名称或者方法名称,i给f函数的参数
            # print(ret.result())  #join
            ret_list.append(ret)
    
        # pool.shutdown()  #锁定线程池,不让新任务再提交进来了.轻易不用
        for i in ret_list:
            print(i.result())

    执行结果:

    线程(ThreadPoolExecutor-0_2) 2的平方: 4
    线程(ThreadPoolExecutor-0_3) 3的平方: 9
    线程(ThreadPoolExecutor-0_1) 1的平方: 1
    线程(ThreadPoolExecutor-0_0) 0的平方: 0
    线程(ThreadPoolExecutor-0_2) 5的平方: 25
    0
    1
    4
    9
    线程(ThreadPoolExecutor-0_4) 4的平方: 16
    16
    25
    线程(ThreadPoolExecutor-0_3) 6的平方: 36
    36
    线程(ThreadPoolExecutor-0_1) 7的平方: 49
    线程(ThreadPoolExecutor-0_2) 9的平方: 81
    49
    线程(ThreadPoolExecutor-0_0) 8的平方: 64
    64
    81

    接下来再看一个实例(add_done_callback回调)

    import time
    from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
    import random
    
    
    def f(n):
        time.sleep(random.randint(1, 3))
        return n * n
    
    
    def call_back(m):
        print(m)
        print(m.result())
    
    
    if __name__ == '__main__':
        pool = ThreadPoolExecutor(max_workers=5)
        pool.submit(f, 2).add_done_callback(call_back)

    执行结果:

    <Future at 0x2998208 state=finished returned int>
    4

    带有回调函数的进程池

    from concurrent.futures import ProcessPoolExecutor
    
    
    def func(name):
        print(name)
        return 123
    
    
    def callback(res):
        print("结束了一个", res.result())
    
    
    if __name__ == '__main__':
        p = ProcessPoolExecutor(3)
        for i in range(5):
            # 添加到进程池,开启该进程,并设置回调,当func结束的时候,自动执行callback,并可以直接拿到func函数执行的返回值
            p.submit(func, f"进程{i}").add_done_callback(callback)
        print("主进程")

     执行结果:

    主进程
    进程0
    进程1
    结束了一个 123
    进程2
    进程3
    结束了一个 123
    进程4
    结束了一个 123
    结束了一个 123
    结束了一个 123
  • 相关阅读:
    关于TNS_ADMIN环境变量
    Oracle Instant Client的安装和使用
    oracle 网络访问配置tnsnames.ora文件的路径
    sql优化(2)
    sql优化(1)
    mybatis的dao的注解
    配置nginx php上传大文件
    给Linux增加swap内存
    MQ选型之RabbitMQ
    Golang并发模型之Context详解
  • 原文地址:https://www.cnblogs.com/lilyxiaoyy/p/11041239.html
Copyright © 2020-2023  润新知