zoukankan      html  css  js  c++  java
  • 线程中的join方法

    join方法的作用是同步线程。

    1、不使用join方法:当设置多个线程时,在一般情况下(无守护线程,setDeamon=False),多个线程同时启动,主线程执行完,会等待其他子线程执行完,程序才会退出。

    def print_number(num):
    
        print("-----> %d" % num, time.ctime())
        time.sleep(5)
        print("print_number ending......", time.ctime())
    
    def print_letter(letter):
    
        print("-----> %s" % letter, time.ctime())
        time.sleep(10)
        print("print_letter ending......", time.ctime())
    
    t1 = threading.Thread(target=print_number,args=(10,))
    t2 = threading.Thread(target=print_letter,args=('hello',))
    
    if __name__ == '__main__':
        t1.start()
        t2.start()
    
        print("Main thread ended...")

    显示结果如下:

    -----> 10 Wed Mar 20 09:22:30 2019
    -----> hello Wed Mar 20 09:22:30 2019
    Main thread ended...
    print_number ending...... Wed Mar 20 09:22:35 2019
    print_letter ending...... Wed Mar 20 09:22:40 2019
    
    ***Repl Closed***

    可以看到主线程、t1、t2同时开始执行,主线程仅打印了“Main thread ended...”,就执行完毕并退出;而程序等待t1和t2执行完毕后才退出。

    2、使用join()方法:主线程主线程任务结束之后,进入阻塞状态,一直等待调用join方法的子线程执行结束之后,主线程才会终止。下面的例子是让t1调用join()方法。

    import threading
    import time
    
    def print_number(num):
    
        print("-----> %d" % num, time.ctime())
        time.sleep(5)
        print("print_number ending......", time.ctime())
    
    def print_letter(letter):
    
        print("-----> %s" % letter, time.ctime())
        time.sleep(10)
        print("print_letter ending......", time.ctime())
    
    t1 = threading.Thread(target=print_number,args=(10,))
    t2 = threading.Thread(target=print_letter,args=('hello',))
    
    if __name__ == '__main__':
        t1.start()
        t2.start()
    
        t1.join()
    
        print("Main thread ended...")

    程序运行结果如下:

    -----> 10 Wed Mar 20 09:20:59 2019
    -----> hello Wed Mar 20 09:20:59 2019
    print_number ending...... Wed Mar 20 09:21:04 2019
    Main thread ended...
    print_letter ending...... Wed Mar 20 09:21:09 2019
    
    ***Repl Closed***

    可以看到与无join方法时的输出顺序明显不同。t1、t2同时启动。而t1的时间短,因此在5秒钟之后该线程执行完毕。由于t1.join(),主线程在执行时,在调用t1.join()方法的地方被阻塞了,在此处一直等待t1执行结束,主线程才会执行最后一行代码。

  • 相关阅读:
    conda环境配置以及pyinstaller报错配置
    软件测试的艺术--读书笔记
    flex布局相关
    移动端特殊样式
    css3中的2D转换
    logo seo优化
    html5 简单的新特性
    css中溢出文字省略号方式
    css用户界面样式
    精灵图与字体图标相关
  • 原文地址:https://www.cnblogs.com/guyexiangyun/p/10563133.html
Copyright © 2011-2022 走看看