美文网首页
python创建多线程的方法【初步了解】

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

作者: 阿登20 | 来源:发表于2020-11-18 12:59 被阅读0次

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

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

    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. 多线程的耗时比单线程要少得多

    相关文章

      网友评论

          本文标题:python创建多线程的方法【初步了解】

          本文链接:https://www.haomeiwen.com/subject/tltciktx.html