Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 4, 2016 18:39:17

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Есть список строк, в него строки потихоньку заносятся в основном цикле скрипта.
Нужно как-то сделать кучу потоков, которые по очереди будут брать строки из этого списка и обрабатывать. Причём если поток уже брал строку не позднее, чем 10 секунд назад, он должен пропустить свою очередь. То есть уже понятно, что каждый поток должен быть объектом и хранить у себя информацию о времени последнего вызова. И вот чем подобную многопоточность организовать я хз.

Что лучше подойдёт для этих целей? Нужна возможность действительно кучу таких потоков запилить и чтоб ни память не кончилась, ни процессор не расплавился. А при наследовании от threading.Thread и переопределении его метода run() происходит именно это. Буду очень признателен за подсказку.

Отредактировано Metallikus (Авг. 4, 2016 18:50:12)

Офлайн

#2 Авг. 4, 2016 19:02:20

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Metallikus
ни процессор не расплавился
Если задача сложная он все равно расплавится, как ни выеживайся. Чего жадть 10 сек, кулер побольше поставьте, обычно железо не должно портиться от работы CPU на полной нагрузке.



Офлайн

#3 Авг. 4, 2016 19:21:10

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Вроде бы greenlet - то, что нужно. Но чёт я не нахожу инфы как с ним в ООП стиле работать. Никому пример с наследованием от этого класса не попадался?

Офлайн

#4 Авг. 5, 2016 00:04:13

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Очереди напрашиваются, модуль queue. Можете у меня в блоге посмотреть статейку и там примеры



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Авг. 5, 2016 02:05:34

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Metallikus
Причём если поток уже брал строку не позднее, чем 10 секунд назад, он должен пропустить свою очередь.
По-моему, неправильный подход это. Когда делаешь потоки, надо предполагать, что запускаться они будут в прямом порядке, а завершаться в обратном. Не должно быть очерёдности у потоков. Какой первее запустился и выполнился, какой вторее - неважно.



Отредактировано py.user.next (Авг. 5, 2016 02:06:46)

Офлайн

#6 Авг. 5, 2016 08:57:03

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

py.user.next
Когда делаешь потоки, надо предполагать, что запускаться они будут в прямом порядке
Но у меня надо обрабатывать целую кучу строк, причём обработка предыдущей строки влияет на алгоритм обработки последующей внутри одного потока. И это влияние подразумевает, что обработка следующей строки ранее, чем через 10 секунд будет некорректной. То есть имеем ту же ситуацию, что и с высокой нагрузкой каждого потока, только в нормальной ситуации он всё это время занят и потому “пропускает” сваою очередь, а у меня тупо ждать должен. Если сделать через наследование от threading.Thread, переопределить там метод run и прописать после обоработки “time.sleep(10)”, то всё работало бы как надо, если бы не так сильно тормозило.

Отредактировано Metallikus (Авг. 5, 2016 08:59:41)

Офлайн

#7 Авг. 5, 2016 09:48:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Metallikus
Но у меня надо обрабатывать целую кучу строк, причём обработка предыдущей строки влияет на алгоритм обработки последующей внутри одного потока.
Опиши конкретней само задание. Потому что вычисления секунд - это признак того, что ты просто неправильно пытаешься сделать что-то. Работа потоков не определена: первый поток может запуститься и завершиться либо первым, либо в середине, либо вообще после всех. И ты никак не предугадаешь. Тебе может казаться, что ты там правильно всё замерил, а оно будет работать вообще неожиданно.



Офлайн

#8 Авг. 5, 2016 12:42:33

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Работаю с неким веб-сервисом, каждый поток - отдельный клиент со своим ключом. Если клиент слишком часто шлёт запросы, веб-сервис запрашивает капчу. Так что либо нейронную сеть пилить, либо не наглеть и добавлять паузы между запросами в каждом (микро)потоке.
Пока пытаюсь как-то gevent прикрутить для создания воркеров.

Отредактировано Metallikus (Авг. 5, 2016 12:43:55)

Офлайн

#9 Авг. 5, 2016 13:41:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10010
Репутация: +  857  -
Профиль   Отправить e-mail  

Особая уличная многопоточность

Metallikus
Если клиент слишком часто шлёт запросы, веб-сервис запрашивает капчу.
А, у каждого клиента должна быть своя очередь (несколько очередей надо сделать). Клиенты просто читают со своих очередей запросы и пересылают на сервер. А в саму очередь запрос добавляется с временным интервалом. Очередями должен управлять распределитель. Вот у него там и хранится вся информация о том, когда был передан последний запрос в каждую из очередей.



Офлайн

#10 Авг. 5, 2016 17:33:19

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Особая уличная многопоточность

Очереди, это правильно. Посмотри на RabbitMQ.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version