С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 09.08.2016
Сообщений: 41

Выход из цикла с потоками join()

15.11.2019, 18:49. Показов 1265. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу придумать нормального решения:

Несколько потоков считают res (каждый по своему), и как только он получен, основная программа едет дальше:

while self.res is None:
pass

Но результат может быть вообще не получен и чтобы это узнать нужно ждать окончания всех потоков:

for t in self.threads:
t.join()

Как можно объединить эти два условия? То есть ждать пока res не перестанет быть none ИЛИ пока все потоки неоттерминейтятся.

Добавлено через 17 минут
кстати

while self.res is None:
pass

меня тоже очень сильно смущает, может посоветуете чем заменить
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2019, 18:49
Ответы с готовыми решениями:

LEFT JOIN и выборка из цикла
Есть таблица - категории - id - cat_name И таблица - Подкатегории - id - cat_id - sub_cat_name Нужно одним запросом...

Указать, при каком условии тело цикла for не выполняется ни разу, а при каком осуществляется выход из цикла
В операторе цикла For I := Start downto Finish do <оператор>; при каком условии тело цикла не выполняется ни разу, а при...

Выход из цикла while
Здрасте. Помогите не могу понять, где ошибка, не выходит из цикла вызов функции y=dihot(1,10,2,1);функция function x =...

7
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.11.2019, 18:57
Цитата Сообщение от alexskr Посмотреть сообщение
while self.res is None:
pass
Зачем это вообще? Каждый поток выполняет вычисление(работу) и затем он должен просто вернуть результат. Это все что нужно.
Кстати, делать вычисления на CPU мультипоточными бесполезно. GIL.
0
2 / 2 / 0
Регистрация: 09.08.2016
Сообщений: 41
15.11.2019, 19:02  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Зачем это вообще? Каждый поток выполняет вычисление(работу)
нет необходимости ждать все потоки (это может быть очень долго), нужно получить первое решение и на остальные уже все равно. хотя этого решения может и вообще не быть и каждый поток закроется без результата.

Цитата Сообщение от Garry Galler Посмотреть сообщение
вычисления на CPU мультипоточными
ну они там еще запросы шлют через реквест, не только считают...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
15.11.2019, 19:11
Цитата Сообщение от alexskr Посмотреть сообщение
нет необходимости ждать все потоки
Ну так в Python для такого варианта есть специальные методы в модулях multiprocessing (это процессы) и multiprocessing.dummy (а это потоки).
Python
1
2
3
4
5
    # Создаём набор обработчиков
    pool = Pool(workers)
    # Открываем ссылки в собственных потоках - возвращаем результаты по мере поступления
    for r in pool.imap_unordered(wrapper_request, urls):
        get_result(r)
Читайте документацию.
Вообще в Python масса оберток над голыми потоками. В чистом виде нет смысла их юзать и изобретать велосипед.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
16.11.2019, 13:25
Цитата Сообщение от Garry Galler Посмотреть сообщение
делать вычисления на CPU мультипоточными бесполезно.
Не всегда потоки могут потреблять процессорное время. Есть и другие задачи, например, потоки могут лочиться на ожидании ввода/вывода (сетевого или дискового). Выполнять задачи по очереди - долго, а параллельно - самый раз.

Добавлено через 1 минуту
TC: https://docs.python.org/3/library/queue.html

Добавлено через 55 секунд
Пример: https://docs.python.org/3/libr... Queue.join
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.11.2019, 14:51
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Не всегда потоки могут потреблять процессорное время
Да. Именно поэтому я и написал "вычисления на CPU", потому что ТС говорил про "считают".
А есть ли у него ожидательные IO-задачи - ТС в первом посте не сообщал.
0
2 / 2 / 0
Регистрация: 09.08.2016
Сообщений: 41
16.11.2019, 15:17  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
"вычисления на CPU"
Виноват, моя вина, именно расчеты как таковые здесь вторичны, потоки у меня больше времени тратят на скачивание получение информации, там парсинг еще небольшой, а потом уже начинают считать. поэтому threading был выбрал.

вчера курил мануалы про синхронизацию потоков, и вот такой вариант придумал:

через event = threading.Event()

главная программа затыкается через event.wait()

а в конце каждого потока:

Python
1
2
if all(not t.is_alive() for t in self.threads if t is not self):
    event.set()
То есть он проверяет, если все потоки стопнуты и он последний - то он снимает блок (это если в случае, что решение так и не было найдено).

Ну и соотвественно, если какой-то из потоков найдет решение, то он снимает блок сразу - без оглядки на другие потоки.

Есть в этом чтото или хрень?

Цитата Сообщение от Рыжий Лис Посмотреть сообщение
окей, пошел еще про очереди курить, благодарю!
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.11.2019, 16:31
Чем вас не устроил imap_unordered или apply_async? Нужно всего лишь взять первый пришедший результат.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2019, 16:31
Помогаю со студенческими работами здесь

Выход из цикла с if
Выход из цикла с помощью if. uses Crt; LABEL m1, m2, m3: integer; var f: integer; begin ClrScr; writeln(' Начало счёта: '); ...

Выход из цикла
Добрый вечер. Есть программка которая генерирует примеры, а пользователь должен дать правильный ответ. program lil; uses crt; ...

Выход из цикла
Проблема следующая: Согласно i из внутреннего цикла берутся значения из вектора, но можно выйти за границы вектора. Для границы снизу...

Выход из цикла while
Не могу выйти из цикла до выполнения update. Как это делается в PL/SQL? Можно другое решение. Написать цикл, увеличивающий цену...

Выход из цикла
Здравствуйте. Как мне сделать чтобы при вводе символа который не цифра или точка в цикле while первом. Выводило ошибку и тело цикла do...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru