这是我第一次使用线程。我想我理解基本原理,但我不确定退出线程是如何工作的。你知道吗
考虑代码:
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
注意:我不是自己写这段代码的,我在网上找到了代码并对其进行了调整,试图更好地理解线程。你知道吗
所以我的问题是:
join()
从未被调用时,为什么线程只执行while循环的一个周期?我希望这些线索永远不会结束。你知道吗谢谢!你知道吗
更新
最初的答案是错误的,因为它遗漏了@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语句替换为:
根据我对线程的理解,在调用join()之前,它们永远不会结束
这不是真的。这完全取决于如何实现在线程中运行的任务。要么重写线程类的run方法,要么提供as-your-task(可调用,如函数)作为target(将在线程的run方法中调用)。当任务终止或出现某种异常时,线程结束。 线程上的join方法实际上是等待线程终止。您还可以提供超时(仅等待特定时间)
<强>1。在上面的代码中,当join()从未被调用时,为什么线程只执行while循环的一个周期?我希望线程永远不会结束。
你怎么知道它在执行一个循环?使用您的代码,我的任务将永远运行 我的输出
如何让线程程序一直运行到用户决定退出它?我的主要目标是让脚本扫描和分析文件,直到用户告诉它退出。
取决于如何编写目标/可运行方法。你可以让逻辑永远运行下去。把线程看作是从当前(主)程序中剥离出来的一部分工作。你应该设计你的任务是原子和简单的!你知道吗
阅读更多here
相关问题 更多 >
编程相关推荐