[Python3] 线程池的使用

认知:

        对于多线程的作用,简单点就是把一项重复的任务分给多个渠道一起完成,这样就大大提高工作效率。

        目前大多数使用线程用的都是threading模块,这模块对于现在来说我认为已经落后了,就拿爬虫来说,动不动就是处理百万千万级别的数据,处理那么大的数据量就需要控制线程的同步、等待、加锁等繁琐操作,这时,到python3就出现了线程池,解决了很多繁琐的操作。

 这里我用到的模块是:concurrent.futures

 可以做到:

  1.  获取线程的运行状态和返回值。
  2. 不需要再加锁,内置可以控制线程的等待 。

话不多说,上代码:

示例:

submit:

使用submit函数来提交线程需要执行的任务(函数名和参数)到线程池中,并返回该任务的句柄(类似于文件、画图),注意submit()不是阻塞的,而是立即返回。

#-*- coding:utf-8 -*-
import time
from concurrent.futures import ThreadPoolExecutor
# 定义一个准备作为线程任务的函数
def task(k):
    for i in k:
        time.sleep(2)
        print(f"等待2s.执行:{i}")
    return k


# 创建一个包含最多2条线程的线程池
pool = ThreadPoolExecutor(max_workers=2)
ks1=[1,2,3,4,5]
ks2=[6,7,8,9,10]
#通过submit函数提交执行的函数到线程池中,submit函数立即返回,不阻塞
future1=pool.submit(task,ks1)#线程1
future2=pool.submit(task,ks2)#线程2
#输出结果
print(f"future1:{future1.result()}")
print(f"future2:{future2.result()}")
# time.sleep(2)
# done方法用于判定某个任务是否完成
# print(future1.done())
# print(future2.done())
#关闭线程池
pool.shutdown()

#输出结果
"""
等待2s.执行:6
等待2s.执行:1

等待2s.执行:7
等待2s.执行:2

等待2s.执行:8
等待2s.执行:3

等待2s.执行:9
等待2s.执行:4

等待2s.执行:5
等待2s.执行:10
future1:[1, 2, 3, 4, 5]
future2:[6, 7, 8, 9, 10]
"""

wait:

wait方法可以让主线程阻塞,直到满足设定的要求。

#-*- coding:utf-8 -*-
from concurrent.futures import ThreadPoolExecutor,wait,ALL_COMPLETED,FIRST_COMPLETED
import time
# 定义一个准备作为线程任务的函数
def action(i):
    time.sleep(2)
    print(i)
    return i*2


# 创建一个包含2条线程的线程池
pool= ThreadPoolExecutor(max_workers=2)
lists=[1,2,3,4,5]
all_task=[pool.submit(action, (i)) for i in lists]
"""
return_when
    ALL_COMPLETED:表明要等待所有的任务都结束。
    or 
    FIRST_COMPLETED:表示第一个任务完成就停止等待。
"""
wait(all_task, return_when=ALL_COMPLETED)
#返回结果值
result=[i.result() for i in all_task]
print(f"result:{result}")
pool.shutdown()

#输出结果
"""
1
2

3
4

5
result:[2, 4, 6, 8, 10]
"""

map:

map方法与python标准库中的map含义相同,都是将序列中的每个元素都执行同一个函数。且输出结果于初始化lists的元素顺序相对应。

#-*- coding:utf-8 -*-
from concurrent.futures import ThreadPoolExecutor
import time
# 定义一个准备作为线程任务的函数
def action(i):
    time.sleep(2)
    print(i)
    return i*2

# 创建一个包含5条线程的线程池
executor = ThreadPoolExecutor(max_workers=5)
lists=[1,2,3,4,5,7,8,9,10]
result=[data for data in executor.map(action, lists)]
print(result)
executor.shutdown()


#输出结果:
"""
#休眠2s
3
4
5
1
2

#休眠2s
7
10
8
9
[2, 4, 6, 8, 10, 14, 16, 18, 20]
"""
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值