zoukankan      html  css  js  c++  java
  • 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 %
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    ruby -- 修改rubymine的字体大小
    ruby -- 基础学习(二) 外键配置实现级联删除
    ruby -- 基础学习(一)项目文件夹说明
    ruby -- 问题解决(二)rails4.0create引起的ActiveModel::ForbiddenAttributesError错误
    ruby -- 问题解决(一)无法连接mysql数据库
    enumerate用法
    python文件调用
    第二天----列表、深浅拷贝、元组、字符串、算数运算、字典、while
    P1005 矩阵取数游戏(动态规划+高精度)
    P1242 新汉诺塔(搜索+模拟退火)
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14193830.html
Copyright © 2011-2022 走看看