• 多线程threading初识,线程等待


    1.线程是程序里面最小的执行单元。

    2.进程是资源的集合。

      线程是包含在进程里面的,一个进程可以有多个线程,但只要要有一个线程。

    一.多线程,就是N个线程一起干活:

      1.传统方式,串行,循环5次需要15s:

    import threading,time
    
    def run():
      time.sleep(3) #干活需要3s
    print('哈哈哈') for i in range(5): #串行 run()

      2.使用多线程并发的方式,节省时间:

    import threading,time
    
    def run():
      time.sleep(3) #干活需要3s print('哈哈哈')
    for i in range(5):#并发
      t = threading.Thread(target=run) #实例化了一个线程,其中target=执行的函数名   t.start() #启动线程

    举例:多线程爬虫,比较下并发和串行的时间:

     串行方式:

    import threading,time,requests
    
    urls = {
        'baidu':'http://www.baidu.com',
        'hao123':'http://www.hao123.com',
        'taobao':'https://www.taobao.com/'
    }
    
    def down_html(file_name,url):
        res = requests.get(url).content  #返回二进制内容
        open(file_name+'.html','wb').write(res)  #因此打开的时候,用wb二进制打开
    
    用串行方式
    start_time = time.time()
    for k,v in urls.items():
         down_html(k,v)
    end_time = time.time()
    
    run_time = end_time - start_time
    print('下载总共花了%s的时间'%run_time)

    串行结果:

    并行方式:这种方式计算的并发时间是不准确的,因为在运行程序时默认先运行主线程,其他线程只是开始运行(下载网页)并不一定结束(而一个进程中的多个线程都是相互独立的。)主线程负责定义函数,启动其他线程等。因此,最终并行运行的结果时间,仅仅是主线程的运行时间。

       主线程
         默认有个主线程
       子线程:
         主线程启动子线程
    import threading,time,requests
    
    urls = {
        'baidu':'http://www.baidu.com',
        'hao123':'http://www.hao123.com',
        'taobao':'https://www.taobao.com/'
    }
    
    def down_html(file_name,url):
        res = requests.get(url).content  #返回二进制内容
        open(file_name+'.html','wb').write(res)  #因此打开的时候,用wb二进制打开
    
    #用并行方式
    start_time = time.time()
    for k,v in urls.items():#因为urls里有3个Key,因此会启动3个线程
        t = threading.Thread(target=down_html,args=(k,v))  #使用多线程调用参数时,必须用args=xx才能传参
        t.start()
    end_time = time.time()
    run_time = end_time - start_time
    print('下载共花了%s时间'%run_time)

    并行结果:

    线程等待:.join()-----实现并发

    下面程序运行流程:

    主线程负责启动5个子线程,把每个线程放在threads list里,然后等待所有线程等待完毕后,再执行end_time = time.time()语句,实现最后计算所有线程都结束的并发时间。

    主线程
         默认有个主线程
    子线程:
        主线程启动子线程
    import threading,time
    def run():
        time.sleep(3):
        print('哈哈哈哈')
    
    start_time = time.time()
    threads=[]  #存放启动的5个子线程
    for i in range(5):
        t = threading.Thread(target=run)  #实例化
        t.start() #启动线程
        threads.append(t) #启动后将子线程加入列表
    
    for t in threads:  #主线程循环等待5个子线程执行结束
        t.join()  #循环等待,等所有线程执行完毕后,再执行下一句,即实现计算所有并发时间
    end_time = time.time()
    print('run_time',end_time-start_time)   

    运行结果:并发时间:(这个时间是准确的)

  • 相关阅读:
    UVa 541 Error Correction
    UVa 11045 My T-shirt suits me
    【模板】Ford-Fulkerson算法
    POJ 1273 Drainage Ditches
    UVa 10158 War
    UVa 658 It's not a Bug, it's a Feature!
    【模板】并查集
    【模板】Floyd-Warshall算法
    UVa 10034 Freckles
    UVa 10048 Audiophobia
  • 原文地址:https://www.cnblogs.com/fancyl/p/9101193.html
Copyright © 2020-2023  润新知