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 %
     
     
     
     
     
     
     
     
     
     

  • 相关阅读:
    Ajax返回xml类型数据
    选择排序 C&&C++
    php 给app写短信验证码 使用memcache缓存验证码
    php 免费的快递查询接口快递100
    CSS字体大小设置时的参考(转)
    excel vba 打印设置(转)
    MySQL的数据类型(转)
    XMind 8 pro update 7激活办法
    张小龙2011年饭否日记
    页面静态化技术Freemarker技术的介绍及使用实例.
  • 原文地址:https://www.cnblogs.com/sea-stream/p/14193830.html
Copyright © 2011-2022 走看看