首页 > 编程语言 >并发编程之守护线程

并发编程之守护线程

时间:2024-01-21 22:00:42浏览次数:36  
标签:编程 主线 并发 完毕 线程 print 进程 守护

无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁

需要强调的是:运行完毕并非终止运行

#1.对主进程来说,运行完毕指的是主进程代码运行完毕

#2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕
#1 主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束,

#2 主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
from threading import Thread
import time


def sayhi(name):
    print('%s say hello' % name)
    time.sleep(2)
    print('%s say bye bye' % name)


if __name__ == '__main__':
    t = Thread(target=sayhi, args=('XIAO',))
    t.daemon = True  # 必须在t.start()之前设置
    t.start()

    print('主线程')
    print(t.is_alive())

# XIAO say hello
# 主线程
# True

迷惑人的例子

from threading import Thread
import time
def foo():
    print(123)
    time.sleep(1)
    print("end123")

def bar():
    print(456)
    time.sleep(3)
    print("end456")


t1=Thread(target=foo)
t2=Thread(target=bar)

t1.daemon=True
t1.start()
t2.start()
print("main-------")

分析:

  • t1 是守护线程,会随着主线程的死亡而死亡
  • 当多线程开启时,主线程运行,开启子线程
  • 再开启主线程
  • 主线程结束后会等待非守护子线程结束,所以需要等待3s,等待func结束运行
  • 所以执行顺序是 子线程1---子线程2---主线程---子线程1结束---子线程2结束

标签:编程,主线,并发,完毕,线程,print,进程,守护
From: https://www.cnblogs.com/xiao01/p/17978442

相关文章

  • 并发编程之多线程操作篇
    多线程简单介绍多线程,或者说多任务,指的是操作系统同时运行多个任务。例如,听歌、洗衣服、看视频可以同时进行,这种就是多任务。单核CPU执行多任务:操作系统轮流让各个任务交替执行,任务1执行t1时间,切换到任务2,任务2执行t2时间,再切换到任务3,执行t3时间...如此反复执行,表面上看,每个任......
  • 并发编程之操作系统引入
    一、引言顾名思义,进程就是正在执行的一个过程。进程是对正在运行程序的一个抽象说法。所谓进程,起源于操作系统最核心的概念,操作系统的其他所有内容都是围绕进程的概念展开的。所以想要真正了解进程,必须事先了解操作系统。二、为什么要有操作系统现代的计算机系统主要是由一个......
  • 并发编程之多进程理论篇
    引言进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是......
  • 线程异步操作
    目录什么是C++中的异步操作?std::async异步调用函数什么是C++中的异步操作?在C++中,异步操作是指在程序执行期间,可以同时执行多个任务,而无需等待前一个任务完成。这种并发执行的方式可以提高程序的性能和响应速度。C++中的异步操作通常通过多线程或异步任务来实现。使用std::asyn......
  • 什么是进程/线程/协程
    这实在是一个过于经典的面试题,尤其是对于go开发者来说,毕竟go有协程这种杀手级的东西,面试官就更爱问这个问题了同时网上相关资料很杂,本身这种抽象概念的理解就没有绝对的标准表达,大家领会意思就够了,哈哈,但带来的问题就是查找相关资料的时候容易把自己越看越乱所以此处我写的内容......
  • 中断机制之通过interrupt实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了interrupt实现线程中断停止用isInterrupted判断当前线程是否被中断,用interrupt()设置线......
  • 中断机制之通过AtomicBoolean实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了AtomicBoolean实现线程中断演示通过修改共享变量的方式来达到通知的目的从而使目的线程......
  • 中断机制之通过volatile实现线程中断停止
    如何停止中断运行中的线程?首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了volatile实现线程中断演示通过修改共享变量的方式来达到通知的目的从而使目的线程中断......
  • JUC并发编程 线程中断介绍及相关Api方法
    什么是中断机制首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供......
  • linux之线程互斥(万字长文详解)
    linux之线程互斥多线程在访问共享资源时的问题假如我们设置一个全局变量!inttickets=1000;//充当有1000张票void*getTicket(void*args){std::stringusername=static_cast<constchar*>(args);while(true){if(tickets>0){......