Python функции и потоки
Есть цикл, который запускает цикл, который запускает функцию 5 потоками. Цикл while ищет на странице сслыки (их всегда 50), затем цикл for передаёт их в функцию 5 потоками с разными параметрами. Всё прекрасно работает пока while не переходит на следующую итерацию. Дебагер показывает что цикл for создаёт ещё 5 потоков в то время как предидущие не закончились, и так с каждой итерацией while.
Как сделать так чтобы цикл for "ждал" пока одна функция законит работу, а потом запускал бы следующую? Или если это будет проще, то "ждал" бы пока все потоки закончат работу, а потом запускал следующие 5.
while j < members_quantity:
url_count = (url + "&offset=" + str(j))
count_data = session.get(url_count, headers=headers)
member_link = re.findall(r"href=\"/(\S+)\" class=\"inline_item", count_data.text)
for i in range(0, len(member_link), 10):
th = Thread(target=parser, args=(login_list[int(i / 10)], password_list[int(i / 10)], member_link[i:i + 10]))
th.start()
j += 50
остановить все потоки при паузе одной функции уже смотрел, не подходит.
Ответы (1 шт):
Можно вот так подождать, пока созданная пачка тредов завершится.
threads = [] # храним потоки в списке
for i in range(0, len(member_link), 10):
th = Thread(target=parser, args=(login_list[int(i / 10)], password_list[int(i / 10)], member_link[i:i + 10]))
th.start()
threads.append(th) # добавляем поток в список
for th in threads: # проходим по сохранённым потокам
th.join() # ждём завершения потока
Вообще не лучший шаблон работы с потоками, у вас получится периодически будет работать всего один поток, самый долгий, когда остальные уже будут завершены.
Лучше сделать нормальную очередь и разгребать её через multiprocessing.Pool.
А ещё лучше использовать asyncio.