孤叶翔云

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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执行结束,主线程才会执行最后一行代码。

posted on 2019-03-20 10:08  孤叶翔云  阅读(2968)  评论(0编辑  收藏  举报