Python - 使 threading.thread 不等待其他线程完成并永远循环
Python - Making threading.thread not to wait for other threads to be done and to loop forever
所以我试图弄清楚线程是如何越来越多的,我只是制作了一个简单的脚本,如下所示:
def test(name):
while True:
print(name)
time.sleep(1)
def main():
try:
random_names = []
for names in [line.rstrip('\n') for line in open('name.txt')]:
random_names.append(names)
threads = []
for name in random_names:
p = threading.Thread(target=test, args=(name,))
threads.append(p)
p.start()
for thread in threads:
thread.join()
except KeyboardInterrupt:
print('Keyboard - Interrupted')
sys.exit()
基本上我只是创建了包含 100 个名称的随机文本文件(完全随机),我的目标是每个线程都会有一个给定的线程 运行ning。
现在有些事情我完全没搞清楚。我假设使用 thread.join 是当有 100 个线程时 运行ning。每当其中 1 个完成时,如果我是正确的,它基本上会等到其余完成?
这让我想到了第二个问题:如果您不希望它发生并且您基本上只想 运行 线程 "for itself" 意味着只要其中一个线程完成,而不是等待它应该继续再次工作而不是等待其余线程到 运行?
我的最后一个问题是,在那种情况下,可以通过哪种方式使线程永远 运行ning?我假设我现在使用的这段代码现在可能是解决方法,因为我使用的是 while True: 但这是一件有效的事情,这是否意味着 thread.join 如果在 def test()?
每个线程将 运行 完全独立于其他线程(除非您创建相互依赖关系)。因此,如果您创建 100 个线程,并且这些线程不需要来自其他线程的任何交互,并且其中一个完成( 即 通过 return 从其目标函数退出) ,其他 99 人不受影响,只会继续 运行。
thread.join
导致调用线程等待,直到单个目标线程完成。在没有超时或其他一些外部因素的情况下,它将 永远 等待目标线程完成。 join
不受除 目标线程之外的任何线程 的影响。换句话说,如果您尝试加入线程 1,而线程 2 退出,这不会导致线程 1 的 join
迟早完成。
在您的代码中,您的线程都在执行 while True
,这意味着它们中的 none 将永远 return 来自其目标函数,因此永远不会 "complete" .这意味着您的主线程将永远挂在第一个 thread.join
调用上。如果您愿意的话,您的 100 个线程永远执行是完全有效的。
同样,您的主线程也可以像这样调用 join
。但当然,主线程 也可以 继续做其他工作。如果您不希望其他线程退出,则不需要主线程调用 join
。它可以简单地 return (实际上,完成自己)。其他线程和您的程序本身将愉快地继续执行。
或者,您甚至可以创建 99 个附加线程并让主线程加入并在第 100 个线程中调用您的 test
函数。 (这当然会使干净的“读取一行开始线程”循环的逻辑复杂化,所以我实际上不建议这样做。)
您现在拥有它的方式似乎很理想。因为您 是 让主线程在 join
中等待(即使 join
永远不会完成),您的 KeyboardInterrupt
异常处理程序仍在范围内在主线程中,以便您的程序在 Ctrl-C 上干净地终止(sys.exit
终止整个进程,因此所有线程都终止)。
编辑:
显然,sys.exit
而不是 终止整个进程——仅终止它在其中执行的线程。您需要使用 KeyboardInterrupt
处理程序中的 os._exit
才能完全退出(或先停止每个线程)。
所以我试图弄清楚线程是如何越来越多的,我只是制作了一个简单的脚本,如下所示:
def test(name):
while True:
print(name)
time.sleep(1)
def main():
try:
random_names = []
for names in [line.rstrip('\n') for line in open('name.txt')]:
random_names.append(names)
threads = []
for name in random_names:
p = threading.Thread(target=test, args=(name,))
threads.append(p)
p.start()
for thread in threads:
thread.join()
except KeyboardInterrupt:
print('Keyboard - Interrupted')
sys.exit()
基本上我只是创建了包含 100 个名称的随机文本文件(完全随机),我的目标是每个线程都会有一个给定的线程 运行ning。
现在有些事情我完全没搞清楚。我假设使用 thread.join 是当有 100 个线程时 运行ning。每当其中 1 个完成时,如果我是正确的,它基本上会等到其余完成?
这让我想到了第二个问题:如果您不希望它发生并且您基本上只想 运行 线程 "for itself" 意味着只要其中一个线程完成,而不是等待它应该继续再次工作而不是等待其余线程到 运行?
我的最后一个问题是,在那种情况下,可以通过哪种方式使线程永远 运行ning?我假设我现在使用的这段代码现在可能是解决方法,因为我使用的是 while True: 但这是一件有效的事情,这是否意味着 thread.join 如果在 def test()?
每个线程将 运行 完全独立于其他线程(除非您创建相互依赖关系)。因此,如果您创建 100 个线程,并且这些线程不需要来自其他线程的任何交互,并且其中一个完成( 即 通过 return 从其目标函数退出) ,其他 99 人不受影响,只会继续 运行。
thread.join
导致调用线程等待,直到单个目标线程完成。在没有超时或其他一些外部因素的情况下,它将 永远 等待目标线程完成。 join
不受除 目标线程之外的任何线程 的影响。换句话说,如果您尝试加入线程 1,而线程 2 退出,这不会导致线程 1 的 join
迟早完成。
在您的代码中,您的线程都在执行 while True
,这意味着它们中的 none 将永远 return 来自其目标函数,因此永远不会 "complete" .这意味着您的主线程将永远挂在第一个 thread.join
调用上。如果您愿意的话,您的 100 个线程永远执行是完全有效的。
同样,您的主线程也可以像这样调用 join
。但当然,主线程 也可以 继续做其他工作。如果您不希望其他线程退出,则不需要主线程调用 join
。它可以简单地 return (实际上,完成自己)。其他线程和您的程序本身将愉快地继续执行。
或者,您甚至可以创建 99 个附加线程并让主线程加入并在第 100 个线程中调用您的 test
函数。 (这当然会使干净的“读取一行开始线程”循环的逻辑复杂化,所以我实际上不建议这样做。)
您现在拥有它的方式似乎很理想。因为您 是 让主线程在 join
中等待(即使 join
永远不会完成),您的 KeyboardInterrupt
异常处理程序仍在范围内在主线程中,以便您的程序在 Ctrl-C 上干净地终止(sys.exit
终止整个进程,因此所有线程都终止)。
编辑:
显然,sys.exit
而不是 终止整个进程——仅终止它在其中执行的线程。您需要使用 KeyboardInterrupt
处理程序中的 os._exit
才能完全退出(或先停止每个线程)。