python - 如何从线程队列Python内部停止线程

标签 python python-3.x multithreading python-multithreading

我遇到的情况是,当线程与当前正在运行/正在执行的线程内的条件匹配时,我需要停止执行线程:

这是我的意思的例子:

  • 我们有 5 个数字的列表,从 1 到 5。
  • 我们将它们排队并与 Run_Calc 函数中的 10 个线程数一起处理它们。
  • 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

关于python - 如何从线程队列Python内部停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58033038/

相关文章:

python - 静态方法 - 如何从另一个方法调用一个方法?

python - 链接延迟回调

python - 如何选择单选按钮?

python - 打印来自 Python 生成器的所有结果

c# - 当创建后台工作人员的进程完成时,后台工作人员是否停止

python - 使用 NumPy 计算向量中的值

python - 在Python中打开标签中的txt文件

python - 将不同数据框中的 2 列与主键条件进行比较,无需合并

c++ - 没有互斥锁的基于模数的负载平衡?

c# - 删除和添加多个项目时锁定 ConcurrentDictionary?