Избранное
sqlite3
Избранное
внимание ушло на коды)
Dmytro
юзай лучше постгрес/мускул/монгу, чем это говно
Избранное
юзай лучше постгрес/мускул/монгу, чем это говно
окей Спасибо) а то я бы парился там)))
Tishka17
вот я прям даже не знаю, советовать монгу ещё при этом
Dmytro
а чо с монгой не так?
Tishka17
очень специфическая БД
Tishka17
Документоориентированная БД мало кому подходит
Kop
Ещё и борьба с ошибками, то ещё
Mikhail
а чо с монгой не так?
Я не видел чего-то кроме паймонги для неё, а она даже не форк сейф
Dmytro
Я не видел чего-то кроме паймонги для неё, а она даже не форк сейф
хз что значит форк сейф. я видел ОРМ для монги.
Tishka17
И зачем это вообще
Kirill
Из ORM есть Mongoengine - вполне юзабельно. Форк-сафети делается легко - один аргумент включающий ленивое создание конекта. Хотя конечно сам выбор Монги должен быть сильно обоснован
Kirill
И зачем это вообще
Если создать конект до того как процесс будет форкнут, то оба процесса будут юзать один конект, что не есть хорошо.
Kirill
А часто ты думаешь о том что делаешь в коде в плане форк-сафети? Вот у тебя в какой момент создаются конекты к базам, или например файлы открываешь и держишь их открытыми? Или какие-то там мьютексы может создаёшь?
Tishka17
Я вообще редко форкаюсь в процессе работы
Tishka17
Обычно заранее создаю нужное число процессов и дальше каждый живёт своей жизнью
Kirill
Ну вот если ты используешь какой-нить uwsgi или другой веб-сервер с поддержкой пультипроцессинга, то у тебя уже есть форкинг по дефолту
Tishka17
Там форк до запуска твоего кода
Kirill
Есть конечно настройка - сначала создать процессы и потом в них запускать питонячий код. Но это дико медленно и памяти больше хавает
Tishka17
Он сначала форкается, а потом уже ты создаешь коннекншы и прочее
Kirill
Там форк до запуска твоего кода
Нет, uwsgi по дефолту сначала инициализирует питонячий код, и только потом форкает уже всё готовое
Tishka17
Хм. Gunicorn наоборот
Kirill
Проще обеспечить форк-сафети, чем мирится с тормозами на старте и потреблением памяти
Co(n)stantine👨‍🔬
Хм. Gunicorn наоборот
юзаешь Gunicorn?
Tishka17
Ну вообще если какой-то пул коннектов юзается, то он обычно при первом коннекте только заполняется
Tishka17
Так что да, форк сейф
Tishka17
Проще обеспечить форк-сафети, чем мирится с тормозами на старте и потреблением памяти
Ну вообще я бы оставил импорты и инициализацию кода до форка, а создание аппа уже потом
Tishka17
В последний раз так делал, когда была адовая кодоненерация при старте
Co(n)stantine👨‍🔬
https://python.libhunt.com/compare-werkzeug-vs-gunicorn 🤔
Kirill
Ну вообще если какой-то пул коннектов юзается, то он обычно при первом коннекте только заполняется
Mongoengine, например, по дефолту сразу пытается конектится к монге, как только ты её "настраиваешь". Надо спец опцию выставить, что бы оно так не делало, а конектилось только при первом реальном запросе в базу. Минусы конечно есть - ошибку в параметрах конекта ты получишь не при запуске проекта, а уже когда придёт реальный запрос от юзера.
Mikhail
И зачем это вообще
Процессы спавнить
Tishka17
Процессы спавнить
Зачем это делать после коннекта, вопрос в этом.
Tishka17
Мне показали, что у кого-то много памяти и долгий старт если форк делать слишком раго. Я не замечал такого
Tishka17
Возможно особенность конкретного кода
Mikhail
Зачем это делать после коннекта, вопрос в этом.
У меня в проекте орм делала коннект на этапе чтения конфига глобального
Mikhail
А почему конфиг надо читать до форка?
Это хороший вопрос, но я получил ответ что с постгрой проблем не было
Kirill
Зачем это делать после коннекта, вопрос в этом.
Не все знают про это. Я вот тоже не задумывался про то что "ресурсы" утекают из процеса при его форке. Но как-то понаблюдал за тем что у меня uwsgi назапускал, и удивился, откуда в мастер-процессе uwsgi висят какие-то левые треды. А это как раз оказались служебные треды, которые pymongo запускает. Вот тогда я и задумался про форк-сафети, и поправил инициализацию конекта к монге. Вероятно есть другие конекторы к базам данных, у которых всё нормально с форк-сафети и с ними не надо про это думать.
Tishka17
Ну я просто инициализирую все после форка
Tishka17
В фабрике аппа
Tishka17
Хех
Kirill
В фабрике аппа
Ну если используется post-fork (как в uwsgi по дефолту), то тут надо уже фабрику-фабрики для аппа 😊 Ну или грамотно подложить соломку в тех местах, где может "поломаться"
Tishka17
Надо глянуть uwsgi, юзал всего раз
Kirill
При использовании WSGI фабрика как бы уже идёт из коробки - функция котороя создаёт app, и отдаёт его веб-серверу. При post-fork наличие этой фабрики само-собой не спасает.
Kirill
Я вот тоже сначала решил "хотфиксик" сделать - переключить uwsgi на pre-fork. Но быстро отказался, увидев как медленно обрабатываются новые запросы (т.к. для них запускаются новые форки с полной инициализацией приложения), и что память стало больше хавать. Проект у меня большой и сложный - на нём разницу сразу видно.
Tishka17
Форки должны запускаться один раз
Tishka17
При старте
Tishka17
дальше запросы обрабатываются уже запущенными процессами
Kirill
Форки должны запускаться один раз
Не обязательно, можно их поднимать и OnDemand. Можно и сразу все - но это увеличивает время до начала обработки запросов.
Tishka17
это прям костыль для приложений у которых что-то течет
Kirill
можно, но ondemand - это какая-то хрень
Кончено он в этом режиме не гасит уже созданные процессы, просто добавляет новые по необходимости, когда имеющиеся заняты
Tishka17
а
Tishka17
ты об этом
Tishka17
тогда не вижу причин почему должно стать меденнее
Tishka17
они все равно один раз запустятся и дальше все норм
Kirill
Ну так медленее обрабатываются вот такие "первые" запросы - они ждут пока под них запустится процесс.
Tishka17
ну у тебя же не все ноды разом переключаются на новую версию
Tishka17
ну да ладно. Если реально большой проект - я бы коечно руками делил то, что до форка и что после него вызывается. Причем по максимуму во второе все выносил, что юзает внение ресурсы
Kirill
А фиг знает как там uwsgi это всё балансит. Мне на моём проекте совсем не понравилось. Особенно с учётом того что у нас есть "харакири" и рестарт по числу обработанных реквестов - процессы могут перезапускаться уже после того как всё "разогналось"
Tishka17
а вот это уже странно
Tishka17
утечки так фиксили?
Kirill
Конечно 😊
Kirill
Самый простой способ забыть про утечки - рестарт через каждые 1000 запросов
Kirill
Ну а харакири - это от тяжёлых запросов. Лучше загасить процесс который обрабатывает запрос больше 30 секунд, чем завесить весь сервер.
Tishka17
а. это да
Max
привет, кто-то встречал: Traceback (most recent call last): File "/Users/max/Documents/univercity/diploma/code/scraper/hotline_spider/collect_proxy.py", line 5, in <module> proxy = collector.get_proxy({'code': ('ua', 'ru', 'by'), 'anonymous': True}) File "/usr/local/lib/python3.7/site-packages/proxyscrape/proxyscrape.py", line 310, in get_proxy self._refresh_resources(False) File "/usr/local/lib/python3.7/site-packages/proxyscrape/proxyscrape.py", line 189, in _refresh_resources refreshed, proxies = resource['proxy-resource'].refresh(force) File "/usr/local/lib/python3.7/site-packages/proxyscrape/scrapers.py", line 85, in refresh proxies = self._func() File "/usr/local/lib/python3.7/site-packages/proxyscrape/scrapers.py", line 168, in get_proxy_daily_http_proxies return _get_proxy_daily_proxies_parse_inner(centers[0], 'http', 'proxy-daily-http') IndexError: list index out of range не пойму в чём косяк и как лечить
Max
(proxyscrape) - всё по доке,..
Alex
Господа, нужна помощь с написание калькулятора, который сможет считать выражения со скобками и т.д