Python——池

预先开启固定个数的进程或线程,当任务来时,直接提交给已经开好的进程或线程,让这个进程或线程执行就可以了。

特点:

1. 节省了进程&线程开启,关闭和切换的时间

2. 减轻了操作系统调度的负担。

3. 为异步非阻塞模式

4. 返回值默认为同步模式(因为要等函数执行完成后才能返回值)

5. 开启和使用的方式,适用于创建进程和线程。

 基本格式:

1
2
3
4
5
6
7
8
9
10
11
12
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()

获取返回值,将会从异步改成同步阻塞状态,因为要获取到返回值以后才可以进行后续的操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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来获取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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来进行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的参数,让子线程来执行对应的任务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的结果会作为参数返回给绑定的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 @   新兵蛋Z  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示