Многопоточность Python останавливается и предотвращает создание новых потоков после первого результата - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть приложение, которое проверяет изменения на сайтах. Мне нужно изменить его так, чтобы первый поток, завершающий работу, останавливал остальные оставшиеся запущенные потоки и предотвращал создание новых потоков, работающих на том же веб-сайте.

Я получил несколько советов о том, что мне следует использовать пулы потоков, но я не уверен, как реализовать пулы потоков и использовать общие переменные (очереди). Прямо сейчас все потоки помещают один и тот же веб-сайт в change_queue, а не просто отправляют первый завершенный результат.

Ниже вы можете увидеть, что у меня есть до сих пор

import time
from Queue import Queue
import threading
import random


change_queue = Queue()


def check_if_changed(domain, change_queue, domain_completed_event):

    # Some pretend processing here
    time.sleep(2)

    # Request work being done here and gives back a result 1 / 0 in is_changed
    is_changed = random.randint(0, 1)

    if is_changed == 1:
        domain_completed_event.set()
        print "domain change happened for domain: " + domain
        change_queue.put(domain) # Should only put each domain once for further processing (Now it can occur multiple times since other threads are already started and working on the same job)

def process_changed_domain(change_queue):
    while True:
        domain = change_queue.get()

        print "Processing... " + domain


def main():
    domain_threads = []

    domains = {
        'checkforchange1.com': threading.Event(), 
        'checkforchange2.com': threading.Event(), 
        'checkforchange3.com': threading.Event()
    }


    # Start thread that listens to the changed domains queues
    t = threading.Thread(target=process_changed_domain, args=(change_queue,))
    t.start()


    # Go through domains
    for domain in domains:
        while domains[domain].is_set() == False:
            t = threading.Thread(target=check_if_changed, args=(domain, change_queue, domains[domain],))
            t.start()
            domain_threads.append(t)
            time.sleep(0.200)

    for thread in domain_threads:
        thread.join()

if __name__ == "__main__":
    main()
...