线程池和进程池
由于频繁的创建线程和进程比较消耗资源,因此可以他通过提前创建多个线程或者多个进程,然后复用这些线程和进程,从而提升程序执行效率。
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
#
pool = ThreadPoolExecutor() # 如果不传递,则为CPU核心数+4,最大为32
def task(name):
print(f"{name} hello world")
time.sleep(4)
return name * name
all_task = []
for i in range(30):
future = pool.submit(task, i)
# print(future.result()) # 会等待线程执行结束
all_task.append(future)
pool.shutdown() # 等待所有的任务执行完毕
# 所有的返回结果都是有序的。
for p in all_task:
print(p.result())
进程池
import os
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
#
pool = ProcessPoolExecutor() # 如果不传递,则为CPU核心数+4,最大为32
def task(name):
print(f"{name} hello world")
time.sleep(4)
print("pid: ", os.getpid())
return name * name
all_task = []
if __name__ == '__main__':
for i in range(30):
future = pool.submit(task, i)
# print(future.result()) # 会等待线程执行结束
all_task.append(future)
pool.shutdown() # 等待所有的任务执行完毕
# 所有的返回结果都是有序的。
for p in all_task:
print(p.result())
任务回调
import os
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
#
pool = ProcessPoolExecutor() # 如果不传递,则为CPU核心数+4,最大为32
def task(name):
print(f"{name} hello world")
time.sleep(4)
print("pid: ", os.getpid())
return name * name
all_task = []
def callback(n):
print("callback ", n)
if __name__ == '__main__':
for i in range(30):
future = pool.submit(task, i).add_done_callback(callback)
# print(future.result()) # 会等待线程执行结束
all_task.append(future)
pool.shutdown() # 等待所有的任务执行完毕
# 所有的返回结果都是有序的。
for p in all_task:
print(p.result())