一、Python创建多线程的方法
image.png如上图所示:
-
准备一个函数
-
import threading
- t = threading.Thread(target=函数对象,args=(函数参数1,参数2,...)) 创建一个线程对象
-
启动线程:t.start()
-
等待结束:t.join()
思路:
循环创建多个线程对象,循环启动线程对象,循环关闭线程。
import threading
import random
# 定义一个函数
def sum_a_b(a,b):
sum1 = a + b
print(f"{a} + {b} = {sum1}")
# 创建一个sum_a_b的线程对象
t = threading.Thread(target=sum_a_b, args=(2, 3))
# 启动线程
t.start()
# 关闭线程,释放资料
t.join()
list1 = random.sample(range(1,100,2),10)
list2 = random.sample(range(2,100,2),10)
# 循环创建多个线程对象。存放到一个列表。
list_t = []
for a, b in zip(list1, list2):
t1 = threading.Thread(target=sum_a_b, args=(a, b))
list_t.append(t1)
# 循环执行线程
for t1 in list_t:
t1.start()
# 循环结束线程
for t2 in range(len(list_t)):
list_t[t2].join()
二、多线爬取博客园首页获取每一页的信息
- 博客园首页我们点击下一页会发现url的变化。都是在末尾加一个数字,我们可以将这个数字设置一个变量传进去就可以得到每一页的url. url = https://www.cnblogs.com/#p{}.format(num)
编写脚本:
import requests
url = "https://www.cnblogs.com/#p2"
def get_cnb(url):
res = requests.get(url)
l = len(res.text)
print(url, l)
get_cnb(url)
# 构造1-29页的url
urls = [f"https://www.cnblogs.com/#p{l}" for l in range(1,30)]
# 构造一个单线程 函数
def one_cnb():
print(f"单线程:one_cnb 开始执行")
for page in urls:
get_cnb(page)
print(f"单线程:one_cnb 结束执行")
# 构造一个多线程 函数
def more_cnb():
print(f"多线程:more_cnb 开始执行")
th = [] # 线程对象列表
for page in urls:
t = threading.Thread(target=get_cnb,args=(page,))
th.append(t)
# 启动多线程
for i in th:
i.start()
# 关闭线程
for i in th:
i.join()
print(f"多线程:more_cnb 结束执行")
if __name__ == '__main__':
import time
# 统计耗时
start = time.time()
one_cnb()
end = time.time()
print(f"one_cnb 单线程耗时 {end - start}s")
start = time.time()
more_cnb()
end = time.time()
print(f"more_cnb 多线程耗时 {end - start}s")
args参数是一个元组,当只有一个参数要加逗号 如上面代码(page,)
总结:
-
单线程执行是按照请求的顺序执行的,而多线程是随机的
-
多线程的耗时比单线程要少得多
网友评论