Как я могу остановить поток изнутри Python очереди очереди - PullRequest
1 голос
/ 20 сентября 2019

Я нахожусь в ситуации, когда мне нужно прекратить выполнение потока, когда он соответствует условию внутри текущего запущенного / выполняющегося потока:

Вот пример, который я имею в виду:

  • У нас есть список из 5 чисел от 1 до 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
  • Как мне его достичь?

1 Ответ

1 голос
/ 20 сентября 2019

В некоторых случаях потоки могут конкурировать в терминах «кто будет гоняться быстрее», даже если они были созданы последовательно.
Для вашего простого случая используйте 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
...