Python进程——守护线程

守护进程

在上一遍文章中我们已经介绍了创建线程,对线程也有一些了解,现在一起来看看守护进程。

无论是进程还是线程,都遵循:守护xx会等待主xx运行完毕后被销毁。需要强调的是:运行完毕并非终止运行

1
2
- 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束。
- 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

举个例,设置一个主人,在设置几个仆人,这几个仆人都是为主人服务的。可以帮主人做很多事情,一个主人(主线程)可以有多个仆人(守护线程),服务的前提是,主线程必须存在,如果主线程不存在,则守护进程也没了。那守护进程是干嘛的呢?可以管理一些资源,打开一些文件,监听一些端口,监听一些资源,把一些垃圾资源回收,可以干很多事情,可以随便定义。

守护线程设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import threading
import time


def run(n):
print('task:', n)
time.sleep(2)
print('task done', n)


start_time = time.time()
for i in range(5):
t = threading.Thread(target=run, args=('t-{0}'.format(i),))
t.setDaemon(True) # Daemon意思是守护进程,这边是把当前线程设置为守护线程
t.start()

print("所有线程已经完成")
print('cost:', time.time() - start_time)

# 执行结果
task: t-0
task: t-1
task: t-2
task: t-3
task: t-4
所有线程已经完成
cost: 0.0019915103912353516

注意:守护进程一定要在start之前设置,start之后就不能设置了,之后设置会报错,所以必须在start之前设置

统计线程数(补充点)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import threading, time


def run(n):
print('task:', n)
time.sleep(2)
print('task done', n, threading.current_thread()) # 查看每个子线程


start_time = time.time()
for i in range(5):
t = threading.Thread(target=run, args=('t-{0}'.format(i),))
t.start()

print('--------', threading.current_thread(), threading.active_count()) # 查看主线程和当前活动的所有线程数
print('cost:', time.time() - start_time)

上面例子是查看当前线程和统计活动线程个数,用theading.current_thead() 查看当前线程;用theading.active_count()来统计当前活动的线程数线程个数=子线程数+主线程数

-------------本文结束感谢您的阅读-------------

本文标题:Python进程——守护线程

文章作者:GavinLiu

发布时间:2018年03月05日 - 22:03

最后更新:2018年03月08日 - 23:03

原始链接:http://gavinliu4011.github.io/post/5965383b.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请博主吃个鸡腿吧
0%