进程池的使用实例
import time
from concurrent.futures import ProcessPoolExecutor
def func(name):
print(f"{name}开始")
time.sleep(0.5)
print(f"{name}结束")
if __name__ == '__main__':
p = ProcessPoolExecutor(max_workers=3) # 创建一个进程池
for i in range(1, 10):
p.submit(func, f"进程{i}") # 往进程池内提交任务
p.shutdown() # 主进程等待子进程结束
print("主进程结束")
执行结果:
进程1开始
进程2开始
进程3开始
进程1结束
进程4开始
进程2结束
进程5开始
进程3结束
进程6开始
进程4结束
进程7开始
进程5结束
进程8开始
进程6结束
进程9开始
进程7结束
进程8结束
进程9结束
主进程结束
创建一个进程池,进程池里有3个进程同时在执行任务,哪个进程执行完了,会自动执行下一个任务,相当于原来是一个人干活,现在是3个人一起干活,速度会提高很多。
线程池的使用实例
import time
from concurrent.futures import ThreadPoolExecutor
def func(name):
print(f"{name}开始")
time.sleep(0.5)
print(f"{name}结束")
if __name__ == '__main__':
p = ThreadPoolExecutor(max_workers=3) # 创建一个线程池,里面最多有3个线程同时工作
for i in range(1, 10):
p.submit(func, f"线程{i}")
p.shutdown() # 主线程等待子线程结束
print("主线程结束")
执行结果:
线程1开始
线程2开始
线程3开始
线程3结束
线程1结束
线程2结束
线程4开始
线程5开始
线程6开始
线程5结束
线程4结束
线程6结束
线程7开始
线程8开始
线程9开始
线程7结束
线程8结束
线程9结束
主线程结束
创建一个线程池,线程池里有3个线程同时在执行任务,哪个线程执行完了,会自动执行下一个任务,相当于原来是一个人干活,现在是3个人一起干活,速度会提高很多。
对比看下线程池和进程池(用法完全一样)
import os
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import threading
import random
def f(n):
time.sleep(random.randint(1, 3))
# print(n)
# print("进程(%s) %s的平方: %s" % (os.getpid(), n, n*n))
print("线程(%s) %s的平方: %s" % (threading.current_thread().getName(), n, n * n))
return n * n
if __name__ == '__main__':
pool = ThreadPoolExecutor(max_workers=5)
# pool = ProcessPoolExecutor(max_workers=5)
ret_list = []
for i in range(10):
ret = pool.submit(f, i) # 异步提交任务,f函数名称或者方法名称,i给f函数的参数
# print(ret.result()) #join
ret_list.append(ret)
# pool.shutdown() #锁定线程池,不让新任务再提交进来了.轻易不用
for i in ret_list:
print(i.result())
执行结果:
线程(ThreadPoolExecutor-0_2) 2的平方: 4
线程(ThreadPoolExecutor-0_3) 3的平方: 9
线程(ThreadPoolExecutor-0_1) 1的平方: 1
线程(ThreadPoolExecutor-0_0) 0的平方: 0
线程(ThreadPoolExecutor-0_2) 5的平方: 25
0
1
4
9
线程(ThreadPoolExecutor-0_4) 4的平方: 16
16
25
线程(ThreadPoolExecutor-0_3) 6的平方: 36
36
线程(ThreadPoolExecutor-0_1) 7的平方: 49
线程(ThreadPoolExecutor-0_2) 9的平方: 81
49
线程(ThreadPoolExecutor-0_0) 8的平方: 64
64
81
接下来再看一个实例(add_done_callback回调)
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import random
def f(n):
time.sleep(random.randint(1, 3))
return n * n
def call_back(m):
print(m)
print(m.result())
if __name__ == '__main__':
pool = ThreadPoolExecutor(max_workers=5)
pool.submit(f, 2).add_done_callback(call_back)
执行结果:
<Future at 0x2998208 state=finished returned int>
4
带有回调函数的进程池
from concurrent.futures import ProcessPoolExecutor
def func(name):
print(name)
return 123
def callback(res):
print("结束了一个", res.result())
if __name__ == '__main__':
p = ProcessPoolExecutor(3)
for i in range(5):
# 添加到进程池,开启该进程,并设置回调,当func结束的时候,自动执行callback,并可以直接拿到func函数执行的返回值
p.submit(func, f"进程{i}").add_done_callback(callback)
print("主进程")
执行结果:
主进程
进程0
进程1
结束了一个 123
进程2
进程3
结束了一个 123
进程4
结束了一个 123
结束了一个 123
结束了一个 123