4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|||||||||||
1 | |||||||||||
Управление потоками03.04.2018, 19:09. Показов 2090. Ответов 13
Метки нет (Все метки)
Задача: запустить в поток в котором что-то делается в цикле и в конце цикла в очередь добавляется параметр.
Как только в очередь появляется элемент, запустить группу потоков не превышающего n - ого количества потоков, которые будут брать параметры из очереди и что-то делать пока не очистится очередь. Причем поток, который добавляет в очередь параметры (1 строчка) заканчивается быстрей, чем группа. Как это сделать? C потоками только сегодня познакомился, так что не закидывайте тапками main_threading - метода для запуска первого потока starting_threadin - метод для запуска группы потоков не превышающего n-ого числа потоков
Думаю, нужно как-то .join применить, но как пока не вдупляю Добавлено через 54 минуты Чуток код перепутал
0
|
03.04.2018, 19:09 | |
Ответы с готовыми решениями:
13
Управление двумя потоками и одновременное их "окончание" Управление потоками в Python Работа с потоками Управление потоками Управление потоками |
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
|
03.04.2018, 19:53 | 2 |
в код страшновато глядеть, объясните на пальцах – поток, управляющий очередью, должен быть асинхронным по отношению к основному потоку? или же просто надо сформировать очередь из готового к-ва заданий и распараллелить это на n max?
0
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|
03.04.2018, 20:31 [ТС] | 3 |
0
|
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
|
03.04.2018, 21:04 | 4 |
да. или же Ваше приложение должно быть более сложным, с «динамической» очередью, которая не может быть сформирована единомоментно и может управляться из другого потока. в общем, каков алгоритм?
Добавлено через 3 минуты в общем, мне лично видится 2 варианта: 1. простой, реализуемый в несколько строк – мы получаем список задач и распараллеливаем его на n max потоков. 2. более сложный – у нас есть поток, управляющий распределением задач и есть потом (возможно главный) который управляет очередью задач.
0
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|
03.04.2018, 21:13 [ТС] | 5 |
Есть главный поток, который создается при запуске программы
Главный поток создает поток 1, который парсит данные и добавляет в очередь И вот в этот момент, пока очередь не пуста, должна запуститься группа потоков до n, которые также создаются главным потоком Поток 1 отработал, заполнил очередь, умер. Группа потоков продолжает работать, пока не закончится очередь
0
|
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
|
03.04.2018, 21:14 | 6 |
0
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|
03.04.2018, 21:16 [ТС] | 7 |
0
|
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
|
03.04.2018, 21:29 | 8 |
предлагаю называть негров – неграми Вы в потоках разбираетесь пока от слова никак, так что о5 же предлагаю упростить сначала задачу до п1. По мере осиления переходя к п 2. Если согласны – кивните.
0
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|
03.04.2018, 21:42 [ТС] | 9 |
Хорошо
Добавлено через 1 минуту Как бы я уже реализовал поток 1 и группу потоков, но у меня группа потоков начинается только после окончания потока 1, что затрачивает лишнее время
0
|
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
||||||
03.04.2018, 22:29 | 10 | |||||
если хотите что-то освоить – тогда пока отложите в сторону то, что Вы делаете. вот пример скелетной реализации распараллеливания n задач на k потоков.
Добавлено через 2 минуты тут все понятно пока?
0
|
4 / 4 / 2
Регистрация: 04.04.2015
Сообщений: 186
|
|
03.04.2018, 22:42 [ТС] | 11 |
0
|
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
||||||
03.04.2018, 23:52 | 12 | |||||
Сообщение было отмечено Black Fregat как решение
Решение
не барское это дело – документацию читать?
Добавлено через 46 минут А теперь вариант, который не дожидается окончания формирования очереди задач, а начинает их выполнять сразу по мере поступления (соблюдая ограничение на max к-во потоков). И снова никакие «ручные» потоки нам не нужны.
Код
creating tasks... +2.00: task0 0 +2.20: task1 0 +2.40: task2 0 +2.60: task3 0 +2.80: task4 0 +4.00: task5 1 +4.20: task6 1 +4.40: task7 1 +4.60: task8 1 +4.81: task9 1 +6.00: task10 2 +6.21: task11 2 +6.41: task12 2 +6.61: task13 2 +6.81: task14 2 done creating tasks +8.01: task15 3 +8.21: task16 3 +8.41: task17 3 +8.61: task18 3 +8.81: task19 3 +10.01: task20 4 +10.21: task21 4 +10.41: task22 4 +10.61: task23 4 +10.81: task24 4 +12.01: task25 5 +12.21: task26 5 +12.41: task27 5 +12.61: task28 5 +12.81: task29 5 +14.01: task30 6 +14.22: task31 6 +14.41: task32 6 +14.62: task33 6 +14.81: task34 6 done executing tasks пара моментов, которые надо пояснить, думаю. 1. msg(). она вызывается асинхронно и мы можем получить некоторое месиво в stdout. поэтому там Lock() 2. в данной реализации мы не опрашиваем список futures, попутно получая результаты. вместо этого мы просто ожидаем, когда они все выполнятся. получение же результатов производится через callback (который регистрируется при создании и вызывается при завершении каждого future).
1
|
151 / 102 / 33
Регистрация: 11.08.2016
Сообщений: 574
|
|
06.04.2018, 14:25 | 14 |
в такой формулировке подразумевается, что:
1. мы почему то ничего не знаем о потоках, процессах и GIL, ничего не читали по теме и не сталкивались на практике 2. распараллеливание потоками сферически бессмысленно, что не соответствуют действительности. Раз уж Вы выразили свое мнение – продолжите и расскажите на что именно на практике GIL накладывает существенные ограничения. и на что он не накладывает.
0
|
06.04.2018, 14:25 | |
06.04.2018, 14:25 | |
Помогаю со студенческими работами здесь
14
Управление потоками Управление процессами и потоками Удаленное управление потоками Управление процессами и потоками Управление процессами и потоками Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |