Как остановить указанное c количество потоков - PullRequest
0 голосов
/ 13 апреля 2020

Я хотел бы остановить / убить поток N при получении события сокета. Я не нахожу способа сделать это с моей текущей структурой приложения.

Вот код для запуска потоков:

for i in range(news_viewers):
    t = threading.Thread(target=bot, args=(i + 1,))
    t.daemon = True
    t.name = "Viewer"
    t.start()

Когда я получаю событие, я хотел бы убить / остановить N тему с именем Просмотр в моем списке:

for i in range(number_of_threads_to_kill):
    #number_of_threads_to_kill is received by sockerIO
    for t in threading.enumerate():
        if 'Viewer' in t.getName():
            #I NEED TO CLOSE N THREAD HERE
            print('CLOSE THIS THREAD')

Я не могу найти способ сделать это, я пробовал много вещей, но ни одна из них не сработала.

threading.enumerate () возвращает это:

.., <Thread(Viewer, started daemon 41868)>, <Thread(Viewer, started daemon 53872)>, <Thread(Viewer, started daemon 54748)>, <Thread(Viewer, started daemon 50028)>,...

Может кто-нибудь помочь мне настроить это?

1 Ответ

0 голосов
/ 14 апреля 2020

Я наконец нашел способ закрыть поток.

Когда я запускаю поток, я добавляю идентификатор потока в массиве threads_ids:

global stop_ids, threads_ids
for i in range(news_viewers):
    tid = random.randint(1, 1000)
    threads_ids.append(tid)
    t = threading.Thread(target=bot, args=(tid,))
    t.daemon = True
    t.name = "Viewer"
    t.start()

Когда я хочу закрыть поток Я добавляю первый идентификатор N в массив stop_ids:

global stop_ids, threads_ids
n = threads_ids[:number_of_thread_to_close]
stop_ids = stop_ids + n

В своей функции бота я проверяю каждую N секунду, если идентификатор текущего потока находится в stop_ids:

def bot(id):
    global stop_ids
    ...
    q = True
    while q:
        if id in stop_ids:
            stop_ids.remove(id)
            driver.quit()
            q = False
            break
    ...
...