Python——池
预先开启固定个数的进程或线程,当任务来时,直接提交给已经开好的进程或线程,让这个进程或线程执行就可以了。
特点:
1. 节省了进程&线程开启,关闭和切换的时间
2. 减轻了操作系统调度的负担。
3. 为异步非阻塞模式
4. 返回值默认为同步模式(因为要等函数执行完成后才能返回值)
5. 开启和使用的方式,适用于创建进程和线程。
基本格式:
1 2 3 4 5 6 7 8 9 10 11 12 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor #线程和进程的模块不同 import random import time def func(a): print ( 'stat---->%s' % (a)) time.sleep(random.randint( 1 , 4 )) print ( 'end----->%s' % (a)) tp = ThreadPoolExecutor( 5 ) #开启5个线程 for i in range ( 20 ): ret = tp.submit(func,i) #提交给开启的线程任务,并有传值。 |
result()
获取返回值,将会从异步改成同步阻塞状态,因为要获取到返回值以后才可以进行后续的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import random import time def func(a): print ( 'stat---->%s' % (a)) time.sleep(random.randint( 1 , 4 )) print ( 'end----->%s' % (a)) return 222 tp = ThreadPoolExecutor( 5 ) #开启5个线程 for i in range ( 20 ): ret = tp.submit(func,i) #提交给开启的线程任务,并有传值。 print (ret.result()) print ( 2 ) |
解决办法,先把所有的执行交给池,池会进行排队。而后再由result来获取。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import random import time def func(a): print ( 'stat---->%s' % (a)) time.sleep(random.randint( 1 , 4 )) print ( 'end----->%s' % (a)) return 222 tp = ThreadPoolExecutor( 5 ) ret_lis = [] for i in range ( 20 ): ret = tp.submit(func,i) ret_lis.append(ret) for i2 in ret_lis: print (i2.result()) print ( 2 ) |
shutdown()
将非阻塞更改为阻塞状态。即所有的子进程或线程都结束后,再执行主线程或进程的内容。如果有返回值可以使用relult来进行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import random import time def func(a): print ( 'stat---->%s' % (a)) time.sleep(random.randint( 1 , 2 )) print ( 'end----->%s' % (a)) tp = ThreadPoolExecutor( 5 ) #开启5个线程 for i in range ( 10 ): ret = tp.submit(func,i) #提交给开启的线程任务,并有传值。 tp.shutdown() print ( 888888 ) |
map()
迭代获取iterable中的内容,作为func的参数,让子线程来执行对应的任务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import random import time def func(a): print ( 'stat---->%s' % (a)) time.sleep(random.randint( 1 , 2 )) print ( 'end----->%s' % (a)) return '111' tp = ThreadPoolExecutor( 5 ) ret_lis = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] ret = tp. map (func,ret_lis) #1. 运行func函数 2.将列表中的数据提取出第一个传参进去。3.返回值记录在ret中。4. 直接for循环即可提取出来。 for i in ret: print (i) print ( 888888 ) |
add_done_callback(func)
回调函数,要在ret对应的任务执行完毕后,直接继续执行func的函数内容,并且ret的结果会作为参数返回给绑定的函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import random import time def func(a): print ( 'stat---->%s' % (a)) time.sleep(random.randint( 1 , 2 )) print ( 'end----->%s' % (a)) return '111' def callback(func): print ( 'callback--->%s' % (func.result())) tp = ThreadPoolExecutor( 5 ) for i in range ( 10 ): ret = tp.submit(func,i) ret.add_done_callback(callback) print ( 888888 ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)