线程与进程3-守护线程

join(),等待子线程执行完了,主线程才继续往下执行,等所有线程执行完了,才退出程序。

当把子线程变成守护线程以后,只要主线程(非守护线程)执行完就退出程序,不管子线程完了没完。

主线程没法设置成守护线程。

#主线程启动子线程之后,两者是并行的,相互之间是独立的。
import threading,time

def run(n):
    print(‘task‘,n)
    time.sleep(2)
    print(‘task done‘,threading.current_thread()) #打印当前线程是主线程还是子线程

start_time=time.time()
t_objs=[]

for i in range(10):
    t=threading.Thread(target=run,args=("t-%s"%i,))
    t.setDaemon(True) #把当前线程设置为守护线程,一定要在start之前设置。
    t.start()
    t_objs.append(t)

print(‘----All threads has finished‘,threading.current_thread(),threading.active_count())
print("Cost time is:",time.time()-start_time)

运行结果,没有等待子线程(守护线程)的sleep的2S,而是直接结束了程序了。

没有看到print(‘task done‘,threading.current_thread()) 的输出,证明守护线程被强制关闭了。

task t-0
task t-1
task t-2
task t-3
task t-4
task t-5
task t-6
task t-7
task t-8
task t-9
----All threads has finished <_MainThread(MainThread, started 11936)> 11
Cost time is: 0.0010001659393310547

Process finished with exit code 0
时间: 2024-10-01 23:33:04

线程与进程3-守护线程的相关文章

浅谈守护进程和守护线程

线程是由进程开启的,当开启线程的进程离开时,该线程也自然而然的去了. 一般情况下, Python 中的多线程操作有两种方式: 1.函数式 创建一个活动函数,将函数当做参数传入,然后用 threading 模块: threading.Thread(target = 函数名,args = (a,b)) 2.继承 去继承一个来自 threading.Thread 的类,功能写在 self.run() 中 方法1: from threading import Thread import time def

[Linux] 守护进程和守护线程

对于JAVA而言,一般一个应用程序只有一个进程——JVM.除非在代码里面另外派生或者开启了新进程. 而线程,当然是由进程开启的.当开启该线程的进程离开时,线程也就不复存在了. 所以,对于JAVA而言,线程是完全可以由自己的API自由产生.例如new Thread().但是进程就不同,必须通过调用OS的API,如Runtime.getRuntime.exec(). 所以说,进程是OS级别的概念. 守护线程和用户线程的区别: 二者其实基本上是一样的.唯一的区别在于JVM何时离开. 用户线程:当存在任

守护进程与守护线程的区别

守护进程与守护线程的区别 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 #1.对主进程来说,运行完毕指的是主进程代码运行完毕 #2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕 详细解释: #1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, #2 主线程在其他非守护线程运行完

关于守护进程和守护线程的区别

一.守护进程 1.1.什么是守护进程? 1.守护进程会在主进程代码运行结束的情况下,立即挂掉. 2.守护进程本身就是一个子进程. 3.主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束, 1.2.为什么要用守护进程? 1.守护进程本身就是一个子进程,所以在主进程需要将任务并发执行的时候需要开启子进程. 2.当该子进程执行的任务生命周期伴随着主进程的生命周期时,就需要将该子进程做成守护进程.

python全栈开发基础【第二十四篇】(利用threading模块开线程、join与守护线程、GIL与Lock)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 创建线程的开销比创建进程的开销小,因而创建线程的速度快. #开启进程的第一种方式 from multiprocessing import Process from threading import Thread import os import time def work(): print('<%s> is running'%os.g

第二十八(线程的同步、守护线程、Timer 定时器)

/* 模拟ATM取款,不是线程同步机制,多线程同时对一个账户进行操作 t1 和 t2 异步编程模型:t1线程执行t1,t2线程执行的是t2,两个线程之间谁也不等于谁 同步编程模型:t1线程和t2线程执行,当t1线程必须等于t2的线程执行结果之后,t1线程才能执行 这是同步编程模型. 什么时候需要引入同步 1. 为了数据安全,尽管应用程序的使用率低,但是为了保证数据安全性,必须的加入线程同步机制 线程同步机制 使程序变成了(等同)单线程 2. 在什么条件下需要使用线程同步 <1> 必须是多线程环

线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁

线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i): 3 print(i) 4 if __name__ == '__main__': 5 for i in range(10): 6 t = Thread(target=f1,args=(i,)) 7 t.start() 8 print('主线程') 方式二: 1 from threading im

进击的Python【第九章】:paramiko模块、线程与进程、各种线程锁、queue队列、生产者消费者模型

一.paramiko模块 他是什么东西? paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 先来个实例: 1 import paramiko 2 # 创建SSH对象 3 ssh = paramiko.SSHClient() 4 5 # 允许连接不在know_hosts文件中的主机 6 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 7 # 连接服务器 8 ss

python网络编程--线程(锁,GIL锁,守护线程)

1.线程 1.进程与线程 进程有很多优点,它提供了多道编程,让我们感觉我们每个人都拥有自己的CPU和其他资源,可以提高计算机的利用率.很多人就不理解了,既然进程这么优秀,为什么还要线程呢?其实,仔细观察就会发现进程还是有很多缺陷的,主要体现在两点上: 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了. 进程在执行的过程中如果阻塞,例如等待输入,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行. 如果这两个缺点理解比较困难的话,举个现实的例子也许你就清楚