• Python程序中的线程操作-concurrent模块


    code1
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    from threading import currentThread
    from multiprocessing import current_process
    import time,os
     
    def task(i):
        print(f'{currentThread().name} 在运行 任务{i}')
        print(f'{current_process().name} 在运行 任务{i}')
        time.sleep(0.2)
        return i**2
     
    if __name__ == '__main__':
        pool = ProcessPoolExecutor(4)
        fu_list = []
        for i in range(20):
            future = pool.submit(task,i)
            # print(future.result())  # 拿不到值会阻塞在这里。
            fu_list.append(future)
     
        pool.shutdown(wait=True)  # 等待池内所有任务执行完毕
        for i in fu_list:
            print(i.result())# 拿不到值会阻塞在这里。
    outputs
    macname@MacdeMacBook-Pro py % python3 cccccc.py
    MainThread 在运行 任务0
    ForkProcess-1 在运行 任务0
    MainThread 在运行 任务1
    ForkProcess-2 在运行 任务1
    MainThread 在运行 任务2
    ForkProcess-3 在运行 任务2
    MainThread 在运行 任务3
    ForkProcess-4 在运行 任务3
    MainThread 在运行 任务4
    ForkProcess-1 在运行 任务4
    MainThread 在运行 任务5
    ForkProcess-2 在运行 任务5
    MainThread 在运行 任务6
    ForkProcess-3 在运行 任务6
    MainThread 在运行 任务7
    ForkProcess-4 在运行 任务7
    MainThread 在运行 任务8
    MainThread 在运行 任务9
    ForkProcess-2 在运行 任务8
    ForkProcess-3 在运行 任务9
    MainThread 在运行 任务10
    ForkProcess-1 在运行 任务10
    MainThread 在运行 任务11
    ForkProcess-4 在运行 任务11
    MainThread 在运行 任务12
    ForkProcess-1 在运行 任务12
    MainThread 在运行 任务13
    ForkProcess-2 在运行 任务13
    MainThread 在运行 任务14
    ForkProcess-3 在运行 任务14
    MainThread 在运行 任务15
    ForkProcess-4 在运行 任务15
    MainThread 在运行 任务16
    ForkProcess-1 在运行 任务16
    MainThread 在运行 任务17
    MainThread 在运行 任务18
    ForkProcess-2 在运行 任务17
    ForkProcess-3 在运行 任务18
    MainThread 在运行 任务19
    ForkProcess-4 在运行 任务19
    0
    1
    4
    9
    16
    25
    36
    49
    64
    81
    100
    121
    144
    169
    196
    225
    256
    289
    324
    361
    macname@MacdeMacBook-Pro py %

     
    code2
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    from threading import currentThread
    from multiprocessing import current_process
    import time,os
     
    def task(i):
        print(f'{currentThread().name} 在运行 任务{i}')
        print(f'{current_process().name} 在运行 任务{i}')
        time.sleep(0.2)
        return i**2
    def parse(future):
        # print(future.result())
        print(currentThread().name,'拿到了结果',future.result()) # 如果是线程池 执行完当前任务 负责执行回调函数的是执行任务的线程。
        print(current_process().name,'拿到了结果',future.result()) # 如果是进程池 执行完当前任务 负责执行回调函数的是执行任务的是主进程
     
     
    if __name__ == '__main__':
        pool = ProcessPoolExecutor(4)
        #pool = ThreadPoolExecutor(4)
        fu_list = []
        for i in range(20):
            future = pool.submit(task,i)
            future.add_done_callback(parse) # 绑定回调函数
            # 当任务执行结束拿到返回值的时候自动触发回调函数。并且把future当做参数直接传给回调函数parse
    outputs
    macname@MacdeMacBook-Pro py % python3 cccccc.py
    MainThread 在运行 任务0
    ForkProcess-1 在运行 任务0
    MainThread 在运行 任务1
    ForkProcess-2 在运行 任务1
    MainThread 在运行 任务2
    ForkProcess-3 在运行 任务2
    MainThread 在运行 任务3
    ForkProcess-4 在运行 任务3
    MainThread 在运行 任务4
    ForkProcess-3 在运行 任务4
    MainThread 在运行 任务5
    ForkProcess-1 在运行 任务5
    MainThread 在运行 任务6
    ForkProcess-4 在运行 任务6
    MainThread 在运行 任务7
    ForkProcess-2 在运行 任务7
    QueueManagerThread 拿到了结果 4
    MainProcess 拿到了结果 4
    QueueManagerThread 拿到了结果 0
    MainProcess 拿到了结果 0
    QueueManagerThread 拿到了结果 9
    MainProcess 拿到了结果 9
    QueueManagerThread 拿到了结果 1
    MainProcess 拿到了结果 1
    MainThread 在运行 任务8
    ForkProcess-2 在运行 任务8
    MainThread 在运行 任务9
    ForkProcess-3 在运行 任务9
    MainThread 在运行 任务10
    ForkProcess-4 在运行 任务10
    MainThread 在运行 任务11
    QueueManagerThread 拿到了结果 49
    ForkProcess-1 在运行 任务11
    MainProcess 拿到了结果 49
    QueueManagerThread 拿到了结果 16
    MainProcess 拿到了结果 16
    QueueManagerThread 拿到了结果 36
    MainProcess 拿到了结果 36
    QueueManagerThread 拿到了结果 25
    MainProcess 拿到了结果 25
    MainThread 在运行 任务12
    ForkProcess-4 在运行 任务12
    MainThread 在运行 任务13
    MainThread 在运行 任务14
    ForkProcess-1 在运行 任务13
    ForkProcess-3 在运行 任务14
    QueueManagerThread 拿到了结果 100
    MainThread 在运行 任务15
    MainProcess 拿到了结果 100
    ForkProcess-2 在运行 任务15
    QueueManagerThread 拿到了结果 121
    MainProcess 拿到了结果 121
    QueueManagerThread 拿到了结果 81
    MainProcess 拿到了结果 81
    QueueManagerThread 拿到了结果 64
    MainProcess 拿到了结果 64
    MainThread 在运行 任务16
    MainThread 在运行 任务17
    ForkProcess-4 在运行 任务16
    ForkProcess-1 在运行 任务17
    MainThread 在运行 任务18
    MainThread 在运行 任务19
    ForkProcess-3 在运行 任务18
    ForkProcess-2 在运行 任务19
    QueueManagerThread 拿到了结果 144
    MainProcess 拿到了结果 144
    QueueManagerThread 拿到了结果 169
    MainProcess 拿到了结果 169
    QueueManagerThread 拿到了结果 196
    MainProcess 拿到了结果 196
    QueueManagerThread 拿到了结果 225
    MainProcess 拿到了结果 225
    QueueManagerThread 拿到了结果 324
    MainProcess 拿到了结果 324
    QueueManagerThread 拿到了结果 289
    MainProcess 拿到了结果 289
    QueueManagerThread 拿到了结果 361
    MainProcess 拿到了结果 361
    QueueManagerThread 拿到了结果 256
    MainProcess 拿到了结果 256
    macname@MacdeMacBook-Pro py %
     
     
    code3
    from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    from threading import currentThread
    from multiprocessing import current_process
    import time,os
     
    def task(i):
        print(f'{currentThread().name} 在运行 任务{i}')
        print(f'{current_process().name} 在运行 任务{i}')
        time.sleep(0.2)
        return i**2
    def parse(future):
        # print(future.result())
        print(currentThread().name,'拿到了结果',future.result()) # 如果是线程池 执行完当前任务 负责执行回调函数的是执行任务的线程。
        print(current_process().name,'拿到了结果',future.result()) # 如果是进程池 执行完当前任务 负责执行回调函数的是执行任务的是主进程
     
    if __name__ == '__main__':
        #pool = ProcessPoolExecutor(4)
        pool = ThreadPoolExecutor(4)
        fu_list = []
        for i in range(20):
            future = pool.submit(task,i)
            future.add_done_callback(parse) # 绑定回调函数
            # 当任务执行结束拿到返回值的时候自动触发回调函数。并且把future当做参数直接传给回调函数parse
    outputs
    macname@MacdeMacBook-Pro py % python3 cccccc.py
    ThreadPoolExecutor-0_0 在运行 任务0
    MainProcess 在运行 任务0
    ThreadPoolExecutor-0_1 在运行 任务1
    ThreadPoolExecutor-0_2 在运行 任务2
    ThreadPoolExecutor-0_3 在运行 任务3
    MainProcess 在运行 任务3
    MainProcess 在运行 任务1
    MainProcess 在运行 任务2
    ThreadPoolExecutor-0_0 拿到了结果 0
    MainProcess 拿到了结果 0
    ThreadPoolExecutor-0_0 在运行 任务4
    MainProcess 在运行 任务4
    ThreadPoolExecutor-0_2 拿到了结果 4
    MainProcess 拿到了结果 4
    ThreadPoolExecutor-0_2 在运行 任务5
    MainProcess 在运行 任务5
    ThreadPoolExecutor-0_3 拿到了结果 9
    MainProcess 拿到了结果 9
    ThreadPoolExecutor-0_3 在运行 任务6
    MainProcess 在运行 任务6
    ThreadPoolExecutor-0_1 拿到了结果 1
    MainProcess 拿到了结果 1
    ThreadPoolExecutor-0_1 在运行 任务7
    MainProcess 在运行 任务7
    ThreadPoolExecutor-0_0 拿到了结果 16
    ThreadPoolExecutor-0_2 拿到了结果 25
    ThreadPoolExecutor-0_1 拿到了结果 49
    ThreadPoolExecutor-0_3 拿到了结果 36
    MainProcess 拿到了结果 36
    MainProcess 拿到了结果 16
    MainProcess 拿到了结果 49
    MainProcess 拿到了结果 25
    ThreadPoolExecutor-0_3 在运行 任务8
    ThreadPoolExecutor-0_0 在运行 任务9
    ThreadPoolExecutor-0_2 在运行 任务11
    ThreadPoolExecutor-0_1 在运行 任务10
    MainProcess 在运行 任务9
    MainProcess 在运行 任务10
    MainProcess 在运行 任务8
    MainProcess 在运行 任务11
    ThreadPoolExecutor-0_0 拿到了结果 81
    MainProcess 拿到了结果 81
    ThreadPoolExecutor-0_0 在运行 任务12
    MainProcess 在运行 任务12
    ThreadPoolExecutor-0_1 拿到了结果 100
    ThreadPoolExecutor-0_2 拿到了结果 121
    MainProcess 拿到了结果 121
    ThreadPoolExecutor-0_3 拿到了结果 64
    ThreadPoolExecutor-0_2 在运行 任务13
    MainProcess 拿到了结果 64
    MainProcess 拿到了结果 100
    ThreadPoolExecutor-0_3 在运行 任务14
    MainProcess 在运行 任务13
    MainProcess 在运行 任务14
    ThreadPoolExecutor-0_1 在运行 任务15
    MainProcess 在运行 任务15
    ThreadPoolExecutor-0_2 拿到了结果 169
    MainProcess 拿到了结果 169
    ThreadPoolExecutor-0_2 在运行 任务16
    MainProcess 在运行 任务16
    ThreadPoolExecutor-0_1 拿到了结果 225
    MainProcess 拿到了结果 225
    ThreadPoolExecutor-0_0 拿到了结果 144
    ThreadPoolExecutor-0_3 拿到了结果 196
    MainProcess 拿到了结果 144
    ThreadPoolExecutor-0_1 在运行 任务17
    MainProcess 拿到了结果 196
    MainProcess 在运行 任务17
    ThreadPoolExecutor-0_3 在运行 任务19
    ThreadPoolExecutor-0_0 在运行 任务18
    MainProcess 在运行 任务19
    MainProcess 在运行 任务18
    ThreadPoolExecutor-0_2 拿到了结果 256
    MainProcess 拿到了结果 256
    ThreadPoolExecutor-0_3 拿到了结果 361
    MainProcess 拿到了结果 361
    ThreadPoolExecutor-0_0 拿到了结果 324
    ThreadPoolExecutor-0_1 拿到了结果 289
    MainProcess 拿到了结果 324
    MainProcess 拿到了结果 289
    macname@MacdeMacBook-Pro py %
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    Docker安装模拟MySQL集群
    Java中类似PHP的var_dump()
    同样的sql语句在数据库中能查出结果,但是在java springboot项目中,查不出来
    import org.junit.Test 导入失败 @Test JUnit4单元测试找不到
    解决用eclipse spring start project 自动创建项目时pom文件错误
    Laravel 队列的简单使用例子
    跨库触发器
    MySQL 主从复制 详细实例讲解 与 常见错误解决方法
    2014年末总结:对大数据处理的一点思考
    Range
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14193830.html
Copyright © 2020-2023  润新知