• python多线程的几种情形分析-三种情况


    情形一:默认情况

      默认情况,只开启线程,那么,主线程结束,其他子线程可能还没结束。

      只使用t=threading.Thead(target=fun),t.start()。

    import threading
    import time
    
    def run():
        time.sleep(2)
        print('当前线程的名字是: ', threading.current_thread().name)
        time.sleep(2)
    
    
    if __name__ == '__main__':
    
        start_time = time.time()
    
        print('这是主线程:', threading.current_thread().name)
        thread_list = []
        for i in range(5):
            t = threading.Thread(target=run)
            thread_list.append(t)
    
        for t in thread_list:
            t.start()
    
        print('主线程结束!' , threading.current_thread().name)
        print('一共用时:', time.time()-start_time)
    例子

    情形二:守护线程(后台线程)

      含义:主线程一结束,其他守护线程跟着一起结束。

      比情形一多了一个t.setDaemon(True),默认情况下是False(前台线程),注意,setDaemon(True)必须在start()前面。

      

    import threading
    import time
    
    def run():
    
        time.sleep(2)
        print('当前线程的名字是: ', threading.current_thread().name)
        time.sleep(2)
    
    
    if __name__ == '__main__':
    
        start_time = time.time()
    
        print('这是主线程:', threading.current_thread().name)
        thread_list = []
        for i in range(5):
            t = threading.Thread(target=run)
            thread_list.append(t)
    
        for t in thread_list:
            t.setDaemon(True)
            t.start()
    
        print('主线程结束了!' , threading.current_thread().name)
        print('一共用时:', time.time()-start_time)
    例子

    情形三:线程同步join

      含义:主线程结束,但需要等待其他子线程的执行,下面的例子,跟没有使用线程没有区别,顺序执行,必须等待第一个join执行完成才能执行下一个。

      与setDaemon相反的是join要写在start()之后,当然,功能也跟setDeamon相反。

    import threading
    import time
    
    def run():
    
        time.sleep(2)
        print('当前线程的名字是: ', threading.current_thread().name)
        time.sleep(2)
    
    
    if __name__ == '__main__':
    
        start_time = time.time()
    
        print('这是主线程:', threading.current_thread().name)
        thread_list = []
        for i in range(5):
            t = threading.Thread(target=run)
            thread_list.append(t)
    
        for t in thread_list:
            t.setDaemon(True)
            t.start()
    
        for t in thread_list:
            t.join()
    
        print('主线程结束了!' , threading.current_thread().name)
        print('一共用时:', time.time()-start_time)
    例子1
    import threading
    import time
    
    def run():
    
        time.sleep(2)
        print('当前线程的名字是: ', threading.current_thread().name)
        time.sleep(2)
    
    
    if __name__ == '__main__':
    
        start_time = time.time()
    
        print('这是主线程:', threading.current_thread().name)
        thread_list = []
        for i in range(5):
            t = threading.Thread(target=run)
            thread_list.append(t)
    
        for t in thread_list:
            t.setDaemon(True)
            t.start()
    
        for t in thread_list:
            t.join(0.2)
    
        print('主线程结束了!' , threading.current_thread().name)
        print('一共用时:', time.time()-start_time)
    例子2

      

    注意:例子二给join传一个0.2的值,那么子程序一共执行1秒钟。可以看到,子线程没完全执行完毕,如果将这个值设置成0.4或者0.5又会如何,大家自己试一试。

    import threading
    import time
    
    def action(arg):
        time.sleep(1)
        print  'sub thread start!the thread name is:%s    ' % threading.currentThread().getName()
        print 'the arg is:%s   ' %arg
        time.sleep(1)
    
    
    for i in range(4):
        t =threading.Thread(target=action,args=(i,))
        t.setDaemon(True)
        t.start()
        t.join()
    
    这样对的程序只能顺序执行,每个线程都被上一个线程的join阻塞,使得“多线程”失去了多线程意义。
    join的错误用法,新手请注意
  • 相关阅读:
    自然语言处理中CNN模型几种常见的Max Pooling操作
    知识图谱(收藏)
    知识图谱ppt&论文笔记
    《A Survey of Answer Extraction Techniques in Factoid Question Answering》Reading Notes
    Reading notes 《A survey on question answering technology from an information retrival perspective》
    《神经网络与深度学习》(七) 浅谈AlphaGo背后所涉及的深度学习技术
    安装opencv4.5中出现的一些问题
    ATK-esp8266加arduino nano
    ubuntu下修改usb设备为固定设备名
    Could not find a package configuration file provided by "manipulation_msgs"
  • 原文地址:https://www.cnblogs.com/hardykay/p/10203175.html
Copyright © 2020-2023  润新知