
Zart
01.06.2016
04:18:17
ну в смысле тот аллованс

No
01.06.2016
04:19:11
Выше вроде описали алгоритм https://en.wikipedia.org/wiki/Token_bucket
По ведру на каждый домен и вперёд.
А вёдра в редис. Хехе.

Google

Zart
01.06.2016
04:20:46
угу... оно и есть, только в токен бакете декремент вроде как на равных интервалах, а в моем примере выше - мы учитываем время с последнего запроса, которое может быть произвольным
суть та же. вёдра надо в чтото с поддержкой атомарного декремента/инкремента
мемкешед, редис. если поебаться с транзакциями, то и сиквел
но если будет ровно один процесс, то можно и в дикт с локом
еще можно плюнуть и заставить этим заниматься нгинкс 8)

drjackild
01.06.2016
04:24:36
спасибо, ща почитаю) по-моему Token Bucket как раз таки то, что ты написал выше, там еще есть Leaky Bucket, вот он вроде с константным интервалом
asyncio в один процесс работает, так что, по идее там даже синхронизировать не надо. а операции изменения значения по ключу вроде атомарны

Sergey
01.06.2016
04:31:00
Парни, как вы оцениваете такой подход к конфигурированию приложения https://gist.github.com/pankovseryi/71fc37256bf6de21b6ad4d31d6a326be ?

Zart
01.06.2016
04:32:52
конфигпарсер на входе умеет принимать имена файлов

Sergey
01.06.2016
04:33:32
Сам подход имеет право на жизнь? Т.к. я несколько дней ломаю голову и люто гуглю на тему как же все таки правильно это сделать.

Zart
01.06.2016
04:34:54
мне вот те все тернарные операторы не нравятся

Sergey
01.06.2016
04:35:29

Google

drjackild
01.06.2016
04:35:58
ну замени их на
CONFIG_FILE_PATH = args.config_file or os.path.join(ROOT_DIR, 'config.ini')

Zart
01.06.2016
04:36:04
у тебя на самом деле куча источников
1) командная строка
2) переменные окружения
3) конфиг
4) дефолты

Sergey
01.06.2016
04:36:52

drjackild
01.06.2016
04:37:57
но Зарт не об этом, я не так понял. он не о синтаксисе, а буквально о количестве источников

Sergey
01.06.2016
04:38:56

Zart
01.06.2016
04:39:46
аргпарсер возвращает объект
у конфигпарсер есть getsection который сразу диктом дёргает всю секцию
os.environ - дикт-лайк объект для доступа к
дефолты можно диктом задать..
имея все эти источники, конфиг можно свести к комбинированию диктов в нужной последовательности

Sergey
01.06.2016
04:42:01

Zart
01.06.2016
04:42:18
https://github.com/ansible/ansible/blob/devel/lib/ansible/constants.py не очень элегантный пример из реального мира
https://github.com/openstack/python-openstackclient/blob/master/openstackclient/shell.py а вот пример попроще, который в дефолты аргпарсу пихает переменные окружения
иногда правда надо решать что имеет приоритет перед чем...

Sergey
01.06.2016
04:44:39

Zart
01.06.2016
04:45:41
у одних тулзов например переменные окружения главнее и перекрывают значения в конфиге
в других - считаются дефолтом и имеют минимальный
обычно аргументы командной строки имеют высший приоритет, но я видел и обратные примеры

Sergey
01.06.2016
04:47:28

Zart
01.06.2016
04:47:43
еще бывают сложные взаимосвязи - когда одни значения рассчитываются от других и тогда важен порядок обхода

Sergey
01.06.2016
04:48:12

Zart
01.06.2016
04:48:16
https://pypi.python.org/pypi/ConfigArgParse 8))
http://stackoverflow.com/a/5826167/356274 вот интересный вариант с поддержкой указания конфига в командной строке

Sergey
01.06.2016
04:49:51

Latish86
01.06.2016
04:53:10
Почему может не работать автокомплит в ipython. Устанавливал через pip

Google

Alexey
01.06.2016
04:53:45
http://pythonclock.org

Zart
01.06.2016
04:54:49
к моменту когда закатится пи2 выйдет питон 4.0...
давайте питон3клок запилим
с той же датой

Maxim robox
01.06.2016
04:55:43
Гвидо говорил, что больше такого не будет, как при выходе 3.0

Zart
01.06.2016
04:55:57
ну и что

drjackild
01.06.2016
05:06:37
короче, что-то такое получилось: https://gist.github.com/DrJackilD/442cc69648704f340a556129eb3d2bc6

Zart
01.06.2016
05:08:19
ow

drjackild
01.06.2016
05:08:44
ой, единственное, наверное не текущее время использовать, а то, которое в запросе

Zart
01.06.2016
05:09:45
это явно не тот алгоритм
((self.timestamp + self.period) - now).total_seconds() там используется трижды. можно было бы один раз посчитать
но мне совершенно не нравятся строки 17 и 24

drjackild
01.06.2016
05:14:12
в данном случае разница с твоим по-моему только в том, что это в теории должно обеспечивать равномерную нагрузку в течении периода
не 60/60, а потом ждать, а с задержкой посылать запросы, чтобы выйти в конце окна на задуманное количество запросов
а что не так со счетчиком?

Zart
01.06.2016
05:16:28
эм...

drjackild
01.06.2016
05:18:15
а про timedelta согласен, надо в начало метода вынести вычисление

Zart
01.06.2016
05:21:03
https://gist.github.com/zart/9a445cbfd11afd59568b0cb4f8709bcb про то что выше

drjackild
01.06.2016
05:24:49
ну да, как я уже сказал, согласен, спасибо за исправление) даже вот так: https://gist.github.com/DrJackilD/442cc69648704f340a556129eb3d2bc6 если использовать значение, которое получено из реквеста. А со счетчиком что не так-то, не томи :)

Zart
01.06.2016
05:25:18
то что у него дикей только после полного периода

Google

Zart
01.06.2016
05:25:31
а я предлагал на каждом реквесте это делать
по сути ты считаешь колво хитов пока не прошел тот самый интервал
по концу интервала резет, причем зачем-то в единицу, а не ноль

drjackild
01.06.2016
05:26:45
так мы предполагаем, что интервал уже прошел и начался новый

Zart
01.06.2016
05:27:00
а. текущий на тот момент и будет первым, ок
твой вариант будет хреново держать рейт

Admin
ERROR: S client not available

drjackild
01.06.2016
05:28:28
сто процентов будет +/- n запросов, ровно не будет

Zart
01.06.2016
05:28:30
положим у тебя лимит 10 реквестов в 10 секунд. для круглого счета
прилетает первый, и у тебя пошел отсчет

drjackild
01.06.2016
05:28:53
но зато не будет точно 10 запросов в секунду, а потом ожидание в 9 секунд

Zart
01.06.2016
05:30:17
проходит скажем 9 секунд и нам влетает 9 реквестов сразу
твой код их пропускает, и положим на этой 11й секунде влетает еще 10
твой код видит что 10 секунд прошло, резетит хиты и отсчитывает эту десятку и ждёт оставшиеся 9-10 сек до интервала
но на этом стыке тебе реально влетело 19 запросов за 1-2 секунды
т.е. при X запросов в Y секунд у тебя есть моменты когда тебе может влететь 2*X запросов мгновенно
после чего придётся ждать Y секунд, но тем не менее

? Snyp
01.06.2016
05:32:06
вчера узнал что в /usr/local/bin можно складывать свои приложения и запускать как комманда без расширения и не только баш скрипты. почему мой скрипт с обычным сообщением echo для теста, не выполянется без прав админа? а другие лежащие в той же папке спокойно грузятся и без админа?

Zart
01.06.2016
05:32:13
моя версия более плавно обрабатывает decay, поэтому такого сильного бёрста не даст

? Snyp
01.06.2016
05:33:37
права?
ну вот я назвал свой файл test и с обычного имени он не выполняется а sudo test выполняется. Права проверял по сравнению с другими файлами лежащими в этой папке - все эндентично.

Zart
01.06.2016
05:33:43
вероятно chmod u+x вместо chmod a+x

Sharkus
01.06.2016
05:33:48
идентично*

Google

Zart
01.06.2016
05:34:21
вообще-то test - это встроенная команда шелла...

Sharkus
01.06.2016
05:34:38
всё.очень.плохо :)

Zart
01.06.2016
05:34:40
и по умолчанию перекрывает бинарник, если только не запустить через \test

drjackild
01.06.2016
05:34:55
согласен с тобой, так может получиться. но я значит не до конца понял твою идею. чет я продолжаю тупить, утро уже на дворе. как ты предлагаешь лучше считать тогда?

Zart
01.06.2016
05:35:34
мне ща с утра тоже влом думать уже... 8\

? Snyp
01.06.2016
05:35:35

Zart
01.06.2016
05:36:01
$ help test
test: test [expr]
Evaluate conditional expression.
...
$ which test
/usr/bin/test
а потом идёт бинарник в /usr/bin, который тоже ловится до твоего, скорее всего

drjackild
01.06.2016
05:41:24
нашел реализацию ведра на питоне https://gist.github.com/drocco007/6155452
если я правильно понимаю, то ты был прав, fill_rate - константная величина

? Snyp
01.06.2016
05:49:54
как полноценная прога.

Zart
01.06.2016
05:50:19
вопрос не осилил
половина вещей в /usr/bin - это шелл или питон скрипты

? Snyp
01.06.2016
05:50:47
ну хз, либо можно либо нельзя.
а перл там может быть?