Python使用multiprocessing.Pool实现固定数量线程池

目录

  • 1. Python使用multiprocessing.Pool实现固定数量线程池
    • 1.1 apply_async方法
    • 1.1 map方法

1. Python使用multiprocessing.Pool实现固定数量线程池

1.1 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]
等待所有线程执行完成

你可能感兴趣的:(Python,python,multiprocessing,多线程,线程池,固定数量线程池)