[PY3]——一个例子理解多线程和daemon

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PY3]——一个例子理解多线程和daemon相关的知识,希望对你有一定的参考价值。

理解

(今天纠结已久,多谢junqi大大帮助理解,一语总结便解心头疑惑)(下面几点总结基本就是我们的对话)

1. 进程就相当于一个机器,多进程就相当于有多个机器在同时运行,多线程是多个任务在同一机器上交替运行,你用一段时间,我用一段时间。

2. 所以进程和线程没有必然联系。

3. 但是不管进程还是线程,一般都是和任务绑定在一起的,任务结束,销毁进程和线程。

4. 如果将进程比喻成一台机器,daemon理解为守护这台机器的东西,daemon守护一旦结束,机器这个进程就down。

5. 可以这样说,一个进程里面会有好几个线程,全部线程结束,那么进程就没有存在的必要了,就会结束。

6. 守护进程这个翻译有点误导人,它并不守护什么,他就提供一些基础服务,就像保持网络连接,这种最基础的功能,就把daemon解释为服务线程,或许能好理解一些。

 

 

def music():
    for i in range(2):
        logging.info("I listening music({})".format(i))
        sleep(10)
        logging.info("end music({})".format(i))

def movie():
    for i in range(2):
        logging.info("I watching movie({})".format(i))
        sleep(15)
        logging.info("end movie({})".format(i))

threads=[]
t1=threading.Thread(target=music)
threads.append(t1)
t2=threading.Thread(target=movie)
threads.append(t2)

 

Example-1

不设Daemon!将Main进程和music、movie两个线程的运行时间轴画出如下:

技术分享

if __name__ == __main__:
    for t in threads:
        # t.setDaemon(True)
        t.start()
        time.sleep(5)

=========运行结果=========
2017-09-18 17:48:16 [Thread-1] I listening music(0)
2017-09-18 17:48:21 [Thread-2] I watching movie(0)
2017-09-18 17:48:26 [Thread-1] end music(0)
2017-09-18 17:48:26 [Thread-1] I listening music(1)
2017-09-18 17:48:36 [Thread-1] end music(1)
2017-09-18 17:48:36 [Thread-2] end movie(0)
2017-09-18 17:48:36 [Thread-2] I watching movie(1)
2017-09-18 17:48:51 [Thread-2] end movie(1)

 

Example-2

将music和movie都设成Daemon!当把他俩都设置为守护线程后,Main就是唯一的前台线程了。关键点:前台线程全部结束后,所有的守护线程立刻终止!运行时间轴如下:

技术分享

if __name__ == __main__:
    for t in threads:
        t.setDaemon(True)   # 都设为daemon #
        t.start()
        time.sleep(5)
        
=========运行结果=========
2017-09-18 18:05:38 [Thread-1] I listening music(0)
2017-09-18 18:05:43 [Thread-2] I watching movie(0)
2017-09-18 18:05:48 [Thread-1] end music(0)
2017-09-18 18:05:48 [Thread-1] I listening music(1)

 

以上是关于[PY3]——一个例子理解多线程和daemon的主要内容,如果未能解决你的问题,请参考以下文章

[Python 多线程] 详解daemon属性值None,False,True的区别

java多线程,对象锁是啥概念?

JAVA DAEMON线程的理解

JAVA编程思想读书笔记--多线程

转关于Java的Daemon线程的理解

Python多线程编程中daemon属性的作用