Python3.x:threading module区分主/子线

作者: james_chang | 来源:发表于2018-03-13 14:27 被阅读15次

    子线程可能我们能比较明白的看出来,而主线程有的时候是看不到的,主线程就是程序本身,但是跟子线程还是有区分的,而threading module提供给我们方法让我们可以知道当前线程是主线程还是子线程让我们来看一下:

    threading.current_thread()  # 当前线程类型
    
    threading.active_count()  # 当前活跃线程数
    

    实例:

    import threading
    import time
    
    
    # 继承类threading.Thread
    class MyThread(threading.Thread):
        def __init__(self, n):
            # 这里要继承构造函数
            super(MyThread, self).__init__()
            # 可以定义自己的实例变量
            self.n = n
    
        def run(self):
            # 打印当前线程类型
            print('running task', self.n, threading.current_thread())
            time.sleep(2)
    
    
    # 得到开始时间
    start_time = time.time()
    # 声明空列表
    threads = []
    
    # 循环开启50线程
    for i in range(50):
        t = MyThread(i)
        t.start()
        # 线程实例放入列表中
        threads.append(t)
    # 打印当前活跃的线程数
    print(threading.active_count())
    # 对线程实例所在列表再循环
    for res in threads:
        # 对每一个实例使用jion()方法
        res.join()
    # 获得结束时间
    end_time = time.time()
    # 计算花费时间
    spend_time = start_time - end_time
    # 打印当前线程类型
    print('all thread has finished', threading.current_thread())
    # 打印花费时间
    print(spend_time)
    

    可以看到在开启50个子线程后活跃线程数为51,这些线程的类型都为Thread(子线程),而最后的则为MainThread(主线程)

    这样,我们就能知道当前线程是主线程还是子线程了,甚至还能知道当前活跃的线程数

    接下来让我们了解一下守护进程,顾名思义,守护进程就是用来守护主线程的,一旦主线程没了,那这些守护线程也就没有存在的意义了
    threading module 提供setDaemon(True)来使子线程变为守护线程,守护线程就是一旦主线程结束了,即使子线程还在运行,也会跟着一起结束,下面让我们实现一下:

    import threading
    import time
    
    
    # 继承类threading.Thread
    class MyThread(threading.Thread):
        def __init__(self, n):
            # 这里要继承构造函数
            super(MyThread, self).__init__()
            # 可以定义自己的实例变量
            self.n = n
    
        def run(self):
            # 打印当前线程类型
            print('running task', self.n, threading.current_thread())
            time.sleep(2)
            # 线程结束打印一句话
            print('done')
    
    
    # 得到开始时间
    start_time = time.time()
    
    # 循环开启50线程
    for i in range(50):
        t = MyThread(i)
        # 设置这个线程为守护线程
        t.setDaemon(True)
        t.start()
    # 打印当前活跃的线程数
    print(threading.active_count())
    
    # 获得结束时间
    end_time = time.time()
    # 计算花费时间
    spend_time = start_time - end_time
    # 打印当前线程类型
    print('all thread has finished', threading.current_thread())
    # 打印花费时间
    print(spend_time)
    

    可以看到,直到程序结束都没有执行每一个线程中的打印‘done’的这段代码,这是因为自线程变成了守护线程,一旦主线程结束,这些守护线程也会跟着一起结束

    这里也有要注意的地方,就是设置自线程为守护线程时必须要在自线程开始之前也就是start()之前

    程序会等待主线程的完成,而不会等待守护线程

    下一篇:Python3.x:threading module线程锁、递归锁、信号量](https://www.jianshu.com/p/1efc74945392)

    转载请注明出处

    python自学技术互助扣扣群:670402334

    相关文章

      网友评论

        本文标题:Python3.x:threading module区分主/子线

        本文链接:https://www.haomeiwen.com/subject/qhdzfftx.html