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