python创建多线程的方法【初步了解】

2020-11-18  本文已影响0人  阿登20

一、Python创建多线程的方法

image.png

如上图所示:

思路:

循环创建多个线程对象,循环启动线程对象,循环关闭线程。

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()

二、多线爬取博客园首页获取每一页的信息

  1. 博客园首页我们点击下一页会发现url的变化。都是在末尾加一个数字,我们可以将这个数字设置一个变量传进去就可以得到每一页的url. url = https://www.cnblogs.com/#p{}.format(num)
image.png

编写脚本:

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,)

image.png

总结:

  1. 单线程执行是按照请求的顺序执行的,而多线程是随机的

  2. 多线程的耗时比单线程要少得多

上一篇下一篇

猜你喜欢

热点阅读