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)

  

posted @ 2022-04-13 11:24  新兵蛋Z  阅读(66)  评论(0)    收藏  举报