📜  Python守护线程

📅  最后修改于: 2022-05-13 01:54:44.318000             🧑  作者: Mango

Python守护线程

总是在后台运行的线程为主线程或非守护线程提供支持,那些后台执行的线程被认为是守护线程。 Daemon Thread不会阻止主线程退出,而是继续在后台运行。本文基于Python中的线程,这里我们通过示例讨论守护线程。

守护线程的最好例子之一是垃圾收集器,因为我们假设主线程正在执行或运行,届时出现任何内存问题, Python虚拟机(PVM)将立即执行垃圾收集器 垃圾收集器将在后台执行并销毁所有无用对象,然后默认提供空闲内存,一旦有空闲内存可用,则主线程将毫无问题地执行。

普通线程学习非守护线程的流程

此示例简化了非守护线程的流程,其中我们创建了一个thread_1()名称函数,该函数具有一些要执行的指令行,这些指令揭示了当主线程终止时非守护线程是如何执行的。接下来我们创建了当前被认为是非活动线程的函数thread_1()的线程T ,现在我们启动线程T,我们也暂时停止了主线程的执行5秒。时间,在这 5 秒之间。线程T继续执行,当主线程将在 5 秒后执行时。它停止工作但仍有一个线程T仍在执行,因为它是一个非守护线程并执行它们的指令直到它们完成。

下面是实现:

Python3
# import module
from threading import *
import time
 
# creating a function
def thread_1():                
  for i in range(5):
    print('this is non-daemon thread')
    time.sleep(2)
 
# creating a thread T
T = Thread(target=thread_1)
 
# starting of thread T
T.start()     
 
# main thread stop execution till 5 sec.
time.sleep(5)                  
print('main Thread execution')


Python3
# import modules
from threading import *
import time
 
# creating a function
def thread_1():                     
  for i in range(5):
    print('this is thread T')
    time.sleep(3)
 
# creating a thread
T = Thread(target = thread_1)
 
# change T to daemon
T.setDaemon(True)                  
 
# starting of Thread T
T.start()                          
time.sleep(5)
print('this is Main Thread')


Python3
# import module
from threading import *
 
print(current_thread().isDaemon())
        
print(current_thread().daemon)


Python3
# import module
from threading import *
 
def fun_daemon():
  print("GFG")
   
thread_1 = Thread(target=fun_daemon)
print(thread_1.isDaemon())
thread_1.start()
print(thread_1.daemon)


Python3
# import module
from threading import *
 
def fun():
    print("Geeks For Geeks")
 
T = Thread(target = fun)
 
print("GFG")
print(T.isDaemon())
 
# set thread as Daemon
T.setDaemon(True) 
 
# check status
print(T.isDaemon())
T.start()


Python3
# import module
from threading import *
 
print(current_thread().setDaemon(True))


输出:

this is non-daemon thread
this is non-daemon thread
this is non-daemon thread
main Thread execution
this is non-daemon thread
this is non-daemon thread

守护线程在非守护线程上的流动

这是一个示例,用于说明在程序执行期间守护线程如何在非守护线程上运行。我们已经在上面的例子中看到了非守护线程如何在主线程终止后完成它的执行,但这里有一些不同。在这个例子中,我们和上面的例子一样创建了一个函数thread_1()和线程T但是这里在创建线程T之后我们使用setDaemon()方法将线程T的非守护进程性质更改为守护进程性质,然后我们启动线程T并暂时停止主线程的执行。这是主线程完成执行并终止时的扭曲,然后线程T也终止,因为这是一个守护线程,其中守护线程在主线程终止时终止它的执行,如果有的话,它的工作是支持主线程没有主线程剩余为什么守护线程会在那里运行,它们也会终止仍然执行指令。

下面是实现:

蟒蛇3

# import modules
from threading import *
import time
 
# creating a function
def thread_1():                     
  for i in range(5):
    print('this is thread T')
    time.sleep(3)
 
# creating a thread
T = Thread(target = thread_1)
 
# change T to daemon
T.setDaemon(True)                  
 
# starting of Thread T
T.start()                          
time.sleep(5)
print('this is Main Thread') 

输出:

this is thread T
this is thread T
this is Main Thread

检查线程是守护进程还是非守护进程的方法

有一种方法和一种属性可以检查以下线程的性质:

  • isDaemon()
  • 守护进程

示例 1:解释 isDaemon() 和守护进程方法的程序。

这是一个简单的例子来解释我们如何检查下面线程的性质或状态,在这个例子中,我们通过使用isDaemon()daemon方法检查主线程的性质。这里我们使用 current_thread() 方法来简化当前正在执行的线程,我们将它与isDaemon()daemon方法一起使用来检查当前线程的性质或状态。这段代码的输出是 False 和 False 因为 current_thread 是主线程总是一个非守护线程。

蟒蛇3

# import module
from threading import *
 
print(current_thread().isDaemon())
        
print(current_thread().daemon)

输出:

False
False

示例 2:

在这个例子中,我们创建了一个函数来检查线程是否是守护进程,然后我们创建一个新线程thread_1 ,它当前是一个非守护线程和非活动线程,然后我们检查线程的状态或性质,在我们启动一个线程之后,输出变为 False 现在线程再次成为活动线程我们检查它的状态再次输出为 False 这一切都意味着不是主线程是非守护进程,但其他创建的线程也是非守护进程。

蟒蛇3

# import module
from threading import *
 
def fun_daemon():
  print("GFG")
   
thread_1 = Thread(target=fun_daemon)
print(thread_1.isDaemon())
thread_1.start()
print(thread_1.daemon)

输出:

False
GFG
False

将非守护进程更改为守护进程

前面我们看到了如何判断后面的线程是守护进程还是非守护进程,这里我们来学习一下后面的非守护线程是如何变成守护进程的。

setDaemon()是用于将给定线程的非守护进程性质更改为守护进程性质的方法。 setDaemon()方法只接受一个布尔值( TrueFalse )参数。

例子:

蟒蛇3

# import module
from threading import *
 
def fun():
    print("Geeks For Geeks")
 
T = Thread(target = fun)
 
print("GFG")
print(T.isDaemon())
 
# set thread as Daemon
T.setDaemon(True) 
 
# check status
print(T.isDaemon())
T.start()

输出:

GFG
False
True
Geeks For Geeks

解释:

在上面的例子中,我们首先导入了一个库线程,然后我们定义了一个新函数fun() ,接下来我们创建了一个新的线程变量T。目前, T是一个非活动线程,我们没有执行start()方法,这里我们将检查线程T的状态,输出为False接下来我们使用方法setDaemon()再次使用该方法后更改线程T的性质 我们将在此检查后续线程的状态时间输出将为True 

将主线程更改为守护线程

如果我们想将本质上总是非守护进程的主线程更改为守护进程,那么我们将得到一个RuntimeError因为当程序启动时主线程也启动了所以主线程是一个活动线程并且活动线程线程未设置为守护进程。

例子:

蟒蛇3

# import module
from threading import *
 
print(current_thread().setDaemon(True))

输出:

RuntimeError: cannot set daemon status of active thread