@stayHARD

Почему создаются дополнительные потоки в конце очереди?

Доброй ночи.
Интересует вопрос связанный с Queue и Threading в Python.
Пишу небольшое многопоточное приложение.
from queue import Queue
from threading import Thread
from grab import Grab

def do_work(link):
    g = Grab()
    g.setup(timeout=30, connect_timeout=5)
    g.go(link)
    print(q.qsize())

def worker():
    while True:
        link = q.get()
        do_work(link)
        q.task_done()

q = Queue()
num_worker_threads = 50

for i in range(num_worker_threads):
    t = Thread(target=worker)
    t.daemon = True
    t.start()
list_urls = [
# big list with urls
]
for item in list_urls:
    q.put(item)

q.join()

В итоге в консоли получаю:
...
38
37
36
35
34
33
32
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
0
0
0
0
0
0
...

В конце получаю такое кол-во нулей сколько выставлено потоков. И да если у меня в листе 500 ссылок, то очередь будет равна 450. Почему так?
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 1
@nirvimel
С виду тут все в полном порядке.
Имеем 50 ПАРАЛЛЕЛЬНЫХ потоков, которые питаются из очереди в 500 элементов.
1. К моменту когда первый поток окончил выполнение своего задания, на выполнение которого потратил некоторое время, в очереди давно уже осталось 450 элементов, ведь расхватывают новые задания потоки мгновенно и ПАРАЛЛЕЛЬНО.
2. К моменту, когда завершилось выполнение 450-го задания, оставшиеся 50 уже находятся в работе, их уже расхватали потоки, и в очереди осталось 0 элементов. После чего оставшиеся 49 потоков заканчивают выполнение своих заданий и каждый рапортует о том, что наблюдает в очереди ноль элементов, после чего воркеры вылетают по task_done() и подбираются join-ом в основном потоке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы