如何在Python的线程队列中停止线程?

9 浏览
0 Comments

如何在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

  • 我该如何实现它?
0
0 Comments

在某些情况下,即使线程是按顺序实例化的,它们也可能在"谁会更快地竞争"方面产生竞争。

对于简单的情况,可以使用线程事件对象`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)被执行时,通过设置事件对象,其他线程可以收到通知并停止执行后续的任务。这样就实现了在特定条件下停止线程的目的。

0