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 %

 

                   

上一篇:Java CountDownLatch应用


下一篇:Java专业术语