📜  在Python中加入线程

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

在Python中加入线程

与同时运行多个独立程序一样,同时运行多个线程也有类似的特点,但也有一些额外的好处,具体如下:

  • 多个线程与进程中的主线程共享相同的数据空间。因此,与进程不同,它们可以轻松共享信息或相互通信。
  • 也称为轻量级进程,它们需要更少的内存开销,因此比进程便宜。

多线程定义为同时或同时执行多个线程的能力。因此,一个进程中可以存在多个线程,其中:

  • 每个线程的寄存器集局部变量都存储在堆栈中。
  • 全局变量(存储在堆中)和程序代码在所有线程之间共享。

加入线程的方法

在调用join()方法时,调用线程被阻塞,直到线程对象(在其上调用线程)被终止。线程对象可以在以下任何一种情况下终止:

  • 要么正常。
  • 通过一个处理不当的异常。
  • 直到发生可选超时。

因此 join() 方法表示等待线程终止。我们还可以为 join() 方法指定一个超时值。在这种情况下,调用线程可以通过事件对象发送信号来请求线程停止。 join() 方法可以被多次调用。

句法:

object_name.join()
OR
object_name.join(timeout) 
where timeout argument is the timeout value.

例子:

Python3
from threading import Thread
from threading import Event
import time
   
  
class Connection(Thread):
   
    StopEvent = 0
      
    def __init__(self,args):
        Thread.__init__(self)
        self.StopEvent = args
  
    # The run method is overridden to define 
    # the thread body 
    def run(self):
   
        for i in range(1,10):
            if(self.StopEvent.wait(0)):
                print ("Asked to stop")
                break;
   
            print("The Child Thread sleep count is %d"%(i))
            time.sleep(3)
          
        print ("A Child Thread is exiting")
  
Stop = Event()
Connection = Connection(Stop)           
Connection.start()
print("Main thread is starting to wait for 5 seconds")
   
Connection.join(5) 
print("Main thread says : I cant't wait for more than 5 \
seconds for the child thread;\n Will ask child thread to stop")
   
# ask(signal) the child thread to stop
Stop.set()
   
# wait for the child thread to stop
Connection.join()
   
print("Main thread says : Now I do something else to compensate\
the child thread task and exit")
print("Main thread is exiting")


输出:

在Python中使用 join() 加入线程时要记住的要点:

  • 当在同一线程上调用 join() 方法和在同一线程上调用 join() 时会发生运行时错误,从而导致死锁情况。
  • 如果在尚未启动的线程上调用 join() 方法,则会引发运行时错误。
  • 如果 join() 有 timeout 参数,那么它应该是一个浮点数,以秒为单位表示线程操作的时间。
  • 如果 join() 方法没有参数,则阻塞直到线程终止操作。
  • 由于 join() 返回的值始终为 None,我们应该始终在 join() 之后立即使用 isAlive() 来检查线程是否还活着。