认知:
对于多线程的作用,简单点就是把一项重复的任务分给多个渠道一起完成,这样就大大提高工作效率。
目前大多数使用线程用的都是threading
模块,这模块对于现在来说我认为已经落后了,就拿爬虫来说,动不动就是处理百万千万级别的数据,处理那么大的数据量就需要控制线程的同步、等待、加锁等繁琐操作,这时,到python3就出现了线程池,解决了很多繁琐的操作。
这里我用到的模块是:concurrent.futures。
可以做到:
- 获取线程的运行状态和返回值。
- 不需要再加锁,内置可以控制线程的等待 。
话不多说,上代码:
示例:
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]
"""