Python中的进程池与线程池

本文详细介绍了如何使用Python的concurrent.futures模块中的ThreadPoolExecutor和ProcessPoolExecutor来控制程序的并发数,通过实例演示了异步提交任务、同步提交任务以及结合回调函数的方法,有效提高了程序执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面我们了解到,可以通过多进程、多线程来提高程序的执行效率。但是随着进程数、线程数的增多,服务器的压力也会越来越大,甚至可能会瘫痪。因此,为了是服务器能够长时间正常运行,我们有必要对程序的并发数进行控制。这时候就会用到进程池和线程池。池的功能就是控制进程数和线程数。
下面以线程池(进程池的用法同线程池一样)为例:
异步提交任务

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,random,time

def task(num):
    time.sleep(random.randint(1, 3))
    print("*"*num)
    return "*"*num

if __name__ == '__main__':
    thread_pool = ThreadPoolExecutor(2) #  设置池子大小为2,即能同时执行的线程数
    for i in range(1,6):
        thread_pool.submit(task,i) # #submit(fn, *args, **kwargs) 异步提交任务

    thread_pool.shutdown(wait=True)
    #关闭线程池,即不能在向池子中添加任务
    #wait=Ture,则表示等待池子里面的任务执行完成,相当于thread_pool.join()
    #若waite= False,则不等待池子里面的任务完成 ,直接执行后面的代码

同步提交任务

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,random,time

def task(num):
    time.sleep(1)
    print("*"*num)
    return "*"*num

if __name__ == '__main__':
    stime = time.time()
    thread_pool = ThreadPoolExecutor(2)
    for i in range(1,6):
        res = thread_pool.submit(task,i).result() # 通过result()拿到返回值,拿到结果后才执行后面的代码
    etime = time.time()
    print(etime-stime)

回调函数+异步调用

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import os,random,time

def task(num):
    time.sleep(random.randint(1,3))
    print("*"*num, end="")
    return "*"*num

def get_length(future):
    res = future.result()
    print(len(res))

if __name__ == '__main__':
    thread_pool = ThreadPoolExecutor(2)
    for i in range(1,6):
        future = thread_pool.submit(task,i)
        future.add_done_callback(get_length)
    print("main")

执行结果

main
*1
**2
***3
*****5
****4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值