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当做参数直接传给回调函数parseoutputs
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当做参数直接传给回调函数parseoutputs
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 %