如何在Python的线程队列中停止线程?
如何在Python的线程队列中停止线程?
我处于这样一种情况,需要在当前正在运行/执行的线程中满足条件时停止执行线程:
下面是我所指的示例:
- 我们有一个从1到5的5个数字的列表。
- 我们将它们排队并与10个线程一起在Run_Calc函数中处理。
- 在
Run_Calc
中,如果满足3
的条件,我希望我的线程停止。
import threading,queue q = queue.Queue() numbers = [1,2,3,4,5] for each_num in numbers: q.put(each_num) def Run_Calc(no): print("NO IS : {}".format(no)) if no == 3: print("YES I WANT TO EXIT HERE and DONT WANT TO EXECUTE 4,5") def ProcessThreading(): while not q.empty(): get_number = q.get() Run_Calc(get_number) th_list = [] for i in range(10): t = threading.Thread(target=ProcessThreading) th_list.append(t) t.start() for th in th_list: th.join()
- 输出:
NO IS : 1 NO IS : 2 NO IS : 3 YES I WANT TO EXIT HERE and DONT WANT TO EXECUTE 4,5 NO IS : 4 NO IS : 5
- 我该如何实现它?
在某些情况下,即使线程是按顺序实例化的,它们也可能在"谁会更快地竞争"方面产生竞争。
对于简单的情况,可以使用线程事件对象`threading.Event`来在特定事件上同步线程:
import queue from threading import Thread, Event q = queue.Queue() numbers = [1, 2, 3, 4, 5] for each_num in numbers: q.put(each_num) def run_calc(num, e): print("NO IS : {}".format(num)) if num == 3: e.set() print("YES I WANT TO EXIT HERE and DONT WANT TO EXECUTE 4,5") def process_thread(e): while not q.empty(): if e.is_set(): break num = q.get() run_calc(num, e) th_list = [] e = Event() for i in range(10): t = Thread(target=process_thread, args=(e,)) th_list.append(t) t.start() for th in th_list: th.join()
输出结果:
NO IS : 1 NO IS : 2 NO IS : 3 YES I WANT TO EXIT HERE and DONT WANT TO EXECUTE 4,5
问题的原因是在多线程情况下可能会出现竞争条件,即线程之间争夺执行的速度。解决方法是使用`threading.Event`对象来同步线程,并在特定事件上进行等待和通知。在给定的代码中,使用了一个队列来存储任务,每个线程从队列中获取任务并执行相应的操作。在某个特定的任务(这里是数字3)被执行时,通过设置事件对象,其他线程可以收到通知并停止执行后续的任务。这样就实现了在特定条件下停止线程的目的。