Python——池
预先开启固定个数的进程或线程,当任务来时,直接提交给已经开好的进程或线程,让这个进程或线程执行就可以了。
特点:
1. 节省了进程&线程开启,关闭和切换的时间
2. 减轻了操作系统调度的负担。
3. 为异步非阻塞模式
4. 返回值默认为同步模式(因为要等函数执行完成后才能返回值)
5. 开启和使用的方式,适用于创建进程和线程。
基本格式:
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()
获取返回值,将会从异步改成同步阻塞状态,因为要获取到返回值以后才可以进行后续的操作。
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来获取。
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来进行。
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的参数,让子线程来执行对应的任务。
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的结果会作为参数返回给绑定的函数。
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)

浙公网安备 33010602011771号