[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的主要内容,如果未能解决你的问题,请参考以下文章