Python使用multiprocessing.Pool实现固定数量线程池
apply_async方法
from multiprocessing import Pool, cpu_count import time import os import traceback def thread_task(number): try: print("线程id为: %d, 处理的任务为:%d, 线程处理【开始】" % (os.getpid(), number)) time.sleep(3) print("线程id为: %d, 处理的任务为:%d, 线程处理【结束】" % (os.getpid(), number)) except Exception as e: print("Exception: " + str(e)) traceback.print_exc() raise Exception(str(e)) if __name__ == '__main__': print("cpu数量为:%d" % cpu_count()) print("主线程id为: %d" % os.getpid()) print("线程开始处理了") # 线程池有3个线程, 线程数量可以大于cpu_count()的数量, 且os.getpid()获取的数值都不一样 thread_pool = Pool(3) for number in range(5): thread_pool.apply_async(thread_task, args=(number,)) print("等待所有线程执行完成") thread_pool.close() thread_pool.join()
执行结果如下:
cpu数量为:8
主线程id为: 8152
线程开始处理了
等待所有线程执行完成
线程id为: 17816, 处理的任务为:0, 线程处理【开始】
线程id为: 39240, 处理的任务为:1, 线程处理【开始】
线程id为: 39808, 处理的任务为:2, 线程处理【开始】
线程id为: 39808, 处理的任务为:2, 线程处理【结束】
线程id为: 39240, 处理的任务为:1, 线程处理【结束】
线程id为: 17816, 处理的任务为:0, 线程处理【结束】
线程id为: 39808, 处理的任务为:3, 线程处理【开始】
线程id为: 39240, 处理的任务为:4, 线程处理【开始】
线程id为: 39808, 处理的任务为:3, 线程处理【结束】
线程id为: 39240, 处理的任务为:4, 线程处理【结束】
如果将thread_pool.apply_async(thread_task, args=(number,))改为thread_pool.apply_async(thread_task, args=(number,)).get(),获取子线程的返回结果,会阻塞主线程,此时相当于单线程,输出结果如下:
cpu数量为:8
主线程id为: 13900
线程开始处理了
线程id为: 15532, 处理的任务为:0, 线程处理【开始】
线程id为: 15532, 处理的任务为:0, 线程处理【结束】
线程id为: 1388, 处理的任务为:1, 线程处理【开始】
线程id为: 1388, 处理的任务为:1, 线程处理【结束】
线程id为: 5472, 处理的任务为:2, 线程处理【开始】
线程id为: 5472, 处理的任务为:2, 线程处理【结束】
线程id为: 15532, 处理的任务为:3, 线程处理【开始】
线程id为: 15532, 处理的任务为:3, 线程处理【结束】
线程id为: 1388, 处理的任务为:4, 线程处理【开始】
线程id为: 1388, 处理的任务为:4, 线程处理【结束】
等待所有线程执行完成
1.1 map方法
相对于apply_async方法,可以多线程处理,并获取结果
from multiprocessing import Pool, cpu_count import time import os import traceback def thread_task(number): try: print("线程id为: %d, 处理的任务为:%d, 线程处理【开始】" % (os.getpid(), number)) time.sleep(3) print("线程id为: %d, 处理的任务为:%d, 线程处理【结束】" % (os.getpid(), number)) return number + 10 except Exception as e: print("Exception: " + str(e)) traceback.print_exc() raise Exception(str(e)) if __name__ == '__main__': print("cpu数量为:%d" % cpu_count()) print("主线程id为: %d" % os.getpid()) print("线程开始处理了") # 线程池有3个线程, 线程数量可以大于cpu_count()的数量, 且os.getpid()获取的数值都不一样 thread_pool = Pool(3) result_list = thread_pool.map(thread_task, range(5)) print(result_list) print("等待所有线程执行完成") thread_pool.close() thread_pool.join()
输出结果如下:
cpu数量为:8
主线程id为: 9504
线程开始处理了
线程id为: 11184, 处理的任务为:0, 线程处理【开始】
线程id为: 17680, 处理的任务为:1, 线程处理【开始】
线程id为: 232, 处理的任务为:2, 线程处理【开始】
线程id为: 11184, 处理的任务为:0, 线程处理【结束】
线程id为: 232, 处理的任务为:2, 线程处理【结束】
线程id为: 17680, 处理的任务为:1, 线程处理【结束】
线程id为: 17680, 处理的任务为:3, 线程处理【开始】
线程id为: 232, 处理的任务为:4, 线程处理【开始】
线程id为: 17680, 处理的任务为:3, 线程处理【结束】
线程id为: 232, 处理的任务为:4, 线程处理【结束】
[10, 11, 12, 13, 14]
等待所有线程执行完成