问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python中threading的join和setDaemon的区别及用法

发布网友 发布时间:2022-04-21 19:32

我来回答

1个回答

热心网友 时间:2022-04-07 13:28

Python多线程编程时经常会用到join()和setDaemon()方法,基本用法如下:
join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
setDaemon,将该线程标记为守护线程或用户线程

1、join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法。
原型:join([timeout]),里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接着执行的。

import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('线程结束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('线程开始:'+str(time.time())) t1.start() print('主线程打印开始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主线程打印结束:' + str(time.time()))

线程开始:1497534590.2784667
主线程打印开始:1497534590.2794669
0
1
2
3
4
主线程打印结束:1497534592.279581
999
线程结束:1497534600.2800388
从打印结果可知,线程t1 start后,主线程并没有等线程t1运行结束后再执行,而是在线程执行的同时,执行了后面的语句。

现在,把join()方法加到启动线程后面(其他代码不变)

import threadingimport time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print('线程结束:'+str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('线程开始:'+str(time.time())) t1.start() t1.join() print('主线程打印开始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主线程打印结束:' + str(time.time()))

线程开始:1497535176.5019968
999
线程结束:1497535186.5025687
主线程打印开始:1497535186.5025687
0
1
2
3
4
主线程打印结束:1497535188.5026832
线程t1 start后,主线程停在了join()方法处,等子线程t1结束后,主线程继续执行join后面的语句。

2、setDaemon()方法。主线程A中,创建了子线程B,并且在主线程A中调用了B.setDaemon(),这个的意思是,把主线程A设置为守护线程,这时候,要是主线程A执行结束了,就不管子线程B是否完成,一并和主线程A退出.这就是setDaemon方法的含义,这基本和join是相反的。此外,还有个要特别注意的:必须在start() 方法调用之前设置。import threading
import time class MyThread(threading.Thread): def __init__(self, id): threading.Thread.__init__(self) self.id = id def run(self): x = 0 time.sleep(10) print(self.id) print("This is:" + self.getName()) # 获取线程名称 print('线程结束:' + str(time.time())) if __name__ == "__main__": t1 = MyThread(999) print('线程开始:'+str(time.time())) t1.setDaemon(True) t1.start() print('主线程打印开始:'+str(time.time())) for i in range(5): print(i) time.sleep(2) print('主线程打印结束:' + str(time.time()))

线程开始:1497536678.8509264
主线程打印开始:1497536678.8509264
0
1
2
3
4
主线程打印结束:1497536680.8510408

t1.setDaemon(True)的操作,将子线程设置为了守护线程。根据setDaemon()方法的含义,父线程打印内容后便结束了,不管子线程是否执行完毕了。
如果在线程启动前没有加t1.setDaemon(True),输出结果为:
线程开始:1497536865.3215919
主线程打印开始:1497536865.3215919
0
1
2
3
4
主线程打印结束:1497536867.3217063
999
This is:Thread-1
线程结束:1497536875.3221638
程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成,如果子线程未完成,则主线程会等待子线程完成后再退出;
有时我们需要的是,子线程运行完,才继续运行主线程,这时就可以用join方法(在线程启动后面);
但是有时候我们需要的是,只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以用setDaemon方法(在线程启动前面)。
Python中threading的join和setDaemon的区别及用法

python中得thread的一些机制和C/C++不同:在C/C++中,主线程结束后,其子线程会默认被主线程kill掉。而在python中,主线程结束后,会默认等待子线程结束后,主线程才退出。python对于thread的管理中有两个函数:join和setDaemon join:如在一个线程B中调用threada.join(),则threada结束后,线程B才会...

Python中threading的join和setDaemon的区别及用法

join:主线程会等待子线程执行完成后再继续往下进行或者退出 setDaemon:主线程执行完成了 不管子线程是否完成,都一起退出

Python中threading的join和setDaemon的区别及用法

个人理解,调用join的时候,主线程会挂起,等到子线程执行完成后,再继续执行。调用setDaemon的时候,子线程会随着主线程一起结束,不管子线程是否执行完成。示例如下:encoding:utf-8import threadingimport timeclass A(threading.Thread): def __init__(self, id): super(A, self).__init__(...

Python中threading的join和setDaemon的区别及用法

join,把要启动的线程阻塞到当前线程,意思是不让当前启动这个线程的进程往后面执行。。。你可以理解为插队。。。比如说,B进程中启动了C,D,E,如果都join了。那么,只有C,D,E执行完后,才会继续执行B。。setDaemon,设置守护,意思是如果主进程断了/结束了,要不要中断子线程 ...

Python中threading的join和setDaemon的区别及用法

多线程/多进程都是通讯或者回调,而不是直接返回结果。这个很容易理解的,因为如果你用返回结果来给一个变量赋值,你就必须等待这个函数结束,你这个程序就阻塞了,这就失去了多线程/多进程防止阻塞的意义了。 通讯可以是事件驱动或者用线程安全

Python中threading的join和setDaemon的区别及用法

有人回答了,我补充下,setDeamon是让线程变成后台守护线程,随着主进程结束而结束,类似linux里的守护进程,随着系统关闭而结束。

Python中threading的join和setDaemon的区别及用法

如果你用了某个窗口系统,你可以用那个窗口系统的event来获得键盘的事件;如果你写的是console的程序,你可以让运行一个Tkinter的Tk,用它来获得键盘事件,Tkinter是python标准库里的。

python的多线程使用setDaemon有什么意义

setDaemon 是把主线程变成守护线程。类似linux中的守护进程。一般是用来当做某种服务的。如果这服务现在要停止了,那么是不应该等待其子线程的。举个例子:比如你做了一个http server,往往可以利用父线程分配线程池启动一个线程给client响应其请求。如果你这个时候你用的join起动一个线程,那么在它结束以前...

Python多线程—threading库使用

在Python中,threading库提供了多线程的支持。创建线程有两种方式:一是定义任务函数,并通过调用start()启动线程;二是定义任务类,继承自threading.Thread,实现自定义线程。使用setDaemon(True)方法,可以将子线程设置为守护线程。当主线程结束时,所有守护线程也将自动终止。通过调用join()方法,主线程可以...

python线程多少秒完成?

加了join后主线程等两个子线程都结束才一起结束,所以最后才出来。 理解确实有点偏差。守护是指子线程守护着主线程,你死我也死,谓之守护。Python多线程的一些问题 python提供了两个模块来实现多线程thread和threading,thread有一些缺点,在threading得到了弥补,为了不浪费你和时间,所以我们直接学习threading就可以了。

attend和join in区别 enter和join的区别 join in与join的区别 attend与join的区别 join和left join区别 set和list集合的特点和区别 join和be in的区别 setoff与setout的区别 set up和found的区别
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
注册监理工程师时是否要提交全日制大专学历,报考时用的是网络教育学历... 《苦斋记》txt全集下载 ppm与mg/ ml怎么换算成mg/ kg? 彩蛋连发,电影剧情却差强人意|《奇异博士2:疯狂多元宇宙》影评(内容涉 ... 如何计算微克/毫克/千克? PPT怎样让一个字闪烁? 请问UG7.0为什么在建模模式下画的图在草图里却无法修改...有点急... 灭门惨案之借种为什么害阿军 ...>\system32\ntoskrnl.exe 停留在 此无法进入系统,怎么办??急_百度... ...把它剪成5块,焊成一个地面是正方形的无盖的长方体容器,它的容积是多... 模拟html中数组中join的功能,照着视频里打的。为... 分库分表中间件的大致原理,跨库的join怎么做 sql 各种连接的使用条件, 求解一个Linux命令join的小问题,直接上图,为啥多... MapJoin和ReduceJoin的区别 join的时候如果有字段为空值 红薯怎么炸好吃家里来客人了 如何用maoreduce实现join 粘米面做熟后发红是什么原因 糯米炸糕的做法(哪位高人指点一下!) 糯米饼的制作方法窍门 糯米卷的做法大全窍门 简单的小零食做法 麻球真正的配方是什么呢? jdk自带线程池有哪些,线程join的原理 麻球的做法和配方 线程间通信有哪些方式 我做的麻团总是鼓不起来,我想问的是做麻团的面就... python threading 一定要 join 吗 Mysql连接join查询原理知识点 oracle什么时候选择hash join算法 怎样把hive join转换成mapreduce 多表关联查询语法? hive sql里,帮我描述一个简单的sql的原理 sql语句中 用 inner join 连接两张表,大表放在前... 睡前剧烈运动对身体有好处吗? 晚上睡觉前运动好吗?? 晚上睡前运动好吗 晚上睡觉之前锻炼身体好吗? 晚上睡觉前锻炼身体好吗? 睡前做运动好不好 晚上临睡前做运动好不好 每天睡觉前锻炼身体可以吗? 睡前运动有什么好处吗? 晚上睡觉前做运动对身体有好处吗.? 晚上锻炼对身体有好处吗 睡觉前 在床上做运动 对身体好么?? 晚上锻炼身体好吗? 睡觉前锻炼身体好吗 晚上睡觉前,锻炼身体好不好?