Python:理解线程和退出线程

2024-04-27 02:37:03 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次使用线程。我想我理解基本原理,但我不确定退出线程是如何工作的。你知道吗

考虑代码:

class myThread (threading.Thread):
  def __init__(self, threadID, name, counter):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.counter = counter
    self.stoprequest=threading.Event()
  def run(self):
    while not self.stoprequest.isSet():
      print("Starting " + self.name)
      print_time(self.name,self.counter)
      print("Exiting " + self.name)

  def join(self, timeout=None):
    self.stoprequest.set()
    super(myThread,self).join(timeout)

def print_time(threadName, delay):
  time.sleep(delay)
  print("%s: %s" % (threadName, time.ctime(time.time())))


thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)

# Start new Threads
thread1.start()
thread2.start()

print("Exiting Main Thread")

从我对线程的理解来看,在调用join()之前,它们永远不会结束,但是在每个线程的while循环中只有一个循环之后,代码才会退出。输出:

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Wed Mar 13 09:13:32 2019
Exiting Thread-1
Thread-2: Wed Mar 13 09:13:33 2019
Exiting Thread-2

注意:我不是自己写这段代码的,我在网上找到了代码并对其进行了调整,试图更好地理解线程。你知道吗

所以我的问题是:

  1. 在上面的代码中,当join()从未被调用时,为什么线程只执行while循环的一个周期?我希望这些线索永远不会结束。你知道吗
  2. 如何让线程程序运行直到用户决定退出它?我的主要目标是让脚本扫描和分析文件,直到用户告诉它退出。你知道吗

谢谢!你知道吗


Tags: 代码nameselftimedefcounter线程thread
2条回答

更新

最初的答案是错误的,因为它遗漏了@ranjith在评论部分提出的一个要点。你知道吗

如果删除myThread定义中的join函数,就会发现程序不会退出,正如@ranjith提到的那样。原因是,当主线程存在时,它会自动调用其所有非守护进程线程上的join,如source code中所示。如果从未为myThread类实现join,则调用join将立即返回,而不会终止子线程。你知道吗

在您的例子中,join被正确地实现,这将self.stoprequest事件设置为true,表示两个子线程停止。因此,当主线程退出时,两个子线程也会退出。你知道吗

最后,注意正确实现join与不实现join但将daemon设置为true之间的区别,尽管它们的行为相似(当主线程存在时子线程停止)。如果将daemon设置为true,则当主线程退出时,子线程将不会等待到stop(参见this section中的注释),而实现join则相反。你知道吗


以下原始答案

这是因为python程序退出,因此所有子线程都被隐式终止。您需要保持程序运行,以便看到两个子线程继续打印内容。你知道吗

例如,将末尾的print语句替换为:

while True:
    print_time('Main', 3)

根据我对线程的理解,在调用join()之前,它们永远不会结束

这不是真的。这完全取决于如何实现在线程中运行的任务。要么重写线程类的run方法,要么提供as-your-task(可调用,如函数)作为target(将在线程的run方法中调用)。当任务终止或出现某种异常时,线程结束。 线程上的join方法实际上是等待线程终止。您还可以提供超时(仅等待特定时间)

<强>1。在上面的代码中,当join()从未被调用时,为什么线程只执行while循环的一个周期?我希望线程永远不会结束。

你怎么知道它在执行一个循环?使用您的代码,我的任务将永远运行 我的输出

Starting Thread-2
Thread-1: Wed Mar 13 12:03:42 2019
Exiting Thread-1
Starting Thread-1
Thread-1: Wed Mar 13 12:03:43 2019
Exiting Thread-1
Starting Thread-1
Thread-2: Wed Mar 13 12:03:44 2019
Exiting Thread-2
Starting Thread-2
Thread-1: Wed Mar 13 12:03:44 2019
Exiting Thread-1
Starting Thread-1
Thread-1: Wed Mar 13 12:03:46 2019
Exiting Thread-1
Starting Thread-1
#and goes on

如何让线程程序一直运行到用户决定退出它?我的主要目标是让脚本扫描和分析文件,直到用户告诉它退出。

取决于如何编写目标/可运行方法。你可以让逻辑永远运行下去。把线程看作是从当前(主)程序中剥离出来的一部分工作。你应该设计你的任务是原子和简单的!你知道吗

阅读更多here

相关问题 更多 >