У меня есть приложение, которое проверяет изменения на сайтах.
Мне нужно изменить его так, чтобы первый поток, завершающий работу, останавливал остальные оставшиеся запущенные потоки и предотвращал создание новых потоков, работающих на том же веб-сайте.
Я получил несколько советов о том, что мне следует использовать пулы потоков, но я не уверен, как реализовать пулы потоков и использовать общие переменные (очереди). Прямо сейчас все потоки помещают один и тот же веб-сайт в 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()