设为首页 加入收藏

TOP

深入理解Python线程中join()函数(一)
2019-04-01 00:08:58 】 浏览:92
Tags:深入 理解 Python 线程 join 函数

首先先简单介绍下守护线程:


守护线程的工作方式类似服务器,只要没有客户端发来请求,就一直运行并且保持空闲,很像是后台。threading模块建立的线程除了守护线程之外,其余的线程都会在主线程结束之前结束掉。也就是说一般会先解决非守护线程的,所以相比而言,守护线程好像就“没那么重要”。设置守护线程使用thread.daemon = True,要在线程启动之前就设置好。


threading模块中join()的作用是为了防止子线程没结束主线程就先结束了,join()对于创建的普通的线程(除了守护线程)是没有多大作用的,有跟没有一样,都是要等到子线程结束后才会执行主线程。守护线程相比普通的线程显得“没有那么重要”,所以主线程一般不等它结束就先结束了。如果是作为守护线程使用join(),那么就会等待守护线程结束后才会执行主线程。


下面对默认的普通线程(即非守护线程)使用join()、不使用join(),和守护线程使用join()、不使用join()进行了分析:


普通线程(即非守护线程)使用join():


import threading


def Thread_1(num):
    print('Thread_1 start')
    for i in range(num):
        print('喵')
    print('Thread_1 end')


def Thread_2(num):
    print('Thread_2 start')
    for i in range(num):
        print('呱')
    print('Thread_2 end')


if __name__ == '__main__':
    thread_list = []
    thread_1 = threading.Thread(target=Thread_1, args=(3,))
    thread_2 = threading.Thread(target=Thread_2, args=(3,))
    #thread_1.daemon = True
    #thread_2.daemon = True
    thread_list.append(thread_1)
    thread_list.append(thread_2)
    for i in thread_list:
        i.start()
    for i in thread_list:
        i.join()
    print('全搞定了.......')


运行结果是这样的:



lt="深入理解Python线程中join()函数" align="center" />


可以看到主线程打印的“全搞定了”是在两个线程执行完了之后才执行的,表明主线程会等待子线程执行完毕再结束。


再看看普通线程(即非守护线程)不使用join(),会不会效果不一样:


import threading


def Thread_1(num):
    print('Thread_1 start')
    for i in range(num):
        print('喵')
    print('Thread_1 end')


def Thread_2(num):
    print('Thread_2 start')
    for i in range(num):
        print('呱')
    print('Thread_2 end')


if __name__ == '__main__':
    thread_list = []
    thread_1 = threading.Thread(target=Thread_1, args=(3,))
    thread_2 = threading.Thread(target=Thread_2, args=(3,))
    # thread_1.daemon = True
    # thread_2.daemon = True
    thread_list.append(thread_1)
    thread_list.append(thread_2)
    for i in thread_list:
        i.start()
    # for i in thread_list:
    #    i.join()
    print('全搞定了.......')


结果跟上面的普通线程使用join()的一模一样(如下图),说明有没有join()对于非守护线程无所谓。


深入理解Python线程中join()函数


 


 


 


 


 


 


 


 


现在来试下守护线程不加上join(),也就是说很可能主线程先结束了子线程还没结束:


import threading


def Thread_1(num):
    print('Thread_1 start')
    for i in range(num):
        print('喵')
    print('Thread_1 end')


def Thread_2(num):
    print('Thread_2 start')
    for i in range(num):
        print('呱')
    print('Thread_2 end')


if __name__ == '__main__':
    thread_list = []
    thread_1 = threading.Thread(target=Thread_1, args=(3,))
    thread_2 = threading.Thread(target=Thread_2, args=(3,))
    thread_1.daemon = True
    thread_2.daemon = True
    thread_list.append(thread_1)
    thread_list.append(thread_2)
    for i in thread_list:
        i.start()
    # for i in thread_list:
    #  &
编程开发网

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python Turtle绘制漂亮彩色螺旋线.. 下一篇Python之lambda 函数理解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(217) }