Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 29, 2018 18:00:16

zarty
Зарегистрирован: 2018-01-29
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про многопоточность и ненужные процессу данные

привет всем.

помогите, чем можете
есть приложение (сервис на фласк/юникорн), в нём два модуля:
1) модуль, содержащий сервисный рест-метод, постоянно держащий в памяти гигабайтный файл для работы с ним (читает файл при импорте модуля);
2) модуль-“синглтон” (по крайней мере на жабе он им бы и был), в котором есть бакграундная функция, которая сливает лог запросов в sql.
время ответа сервиса очень критично, а sql жутко тормозной, потому лог-функцию завернул в @deco.concurrent и так и пользую (дабы не ждать результатов её исполнения, ибо это мне фиолетово).

но есть, зараза, нюанс: процесс, в котором висит лог-функция, занимает тоже гиг.

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

собственно, вопрос - как построить приложение таким образом, чтобы “мухи отдельно, котлеты отдельно”? т.е. чтоб сервис (блупринт-модуль) жрал бы свой гиг и работал с ним, а процесс с лог-функцией (соседний модуль, но к которому обращается сервис) об этом файле даже бы не знал? сие вообще возможно, или при инициализации параллельного процесса инитится вообще всё, начиная с “файла запуска”?

весь мозг уже сломал, не понимаю, куда копать. ткните хотя бы чего почитать на эту тему.

Офлайн

#2 Янв. 29, 2018 21:30:06

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

вопрос про многопоточность и ненужные процессу данные

zarty
ткните хотя бы чего почитать на эту тему
думаю вам надо посмотреть для чего пишут
if __name__==“__main__”



Офлайн

#3 Янв. 30, 2018 13:54:52

zarty
Зарегистрирован: 2018-01-29
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про многопоточность и ненужные процессу данные

doza_and

посмотрел - получается некий аналог сишной main()…
т.е. просто вынести инициализацию “основного” сервиса в name=main в основной скрипт, а все остальные инициализации делать ленивыми?

Офлайн

#4 Янв. 30, 2018 21:52:14

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

вопрос про многопоточность и ненужные процессу данные

zarty
а все остальные инициализации делать ленивыми?

По сути да. Приведите прототип вашего кода. По сути если вам не надо не создавайте лишнего объекта. А разговоры про синглтоны тут вообще туман только напускают. Синглтон в питоне это модуль. и больше ничего не требуется.



Офлайн

#5 Янв. 31, 2018 14:17:58

zarty
Зарегистрирован: 2018-01-29
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос про многопоточность и ненужные процессу данные

doza_and
По сути да. Приведите прототип вашего кода.

в коде там нечто такое (работает под gunicorn):

service.py
from modules.big_file import do_file

app = flask.Flask(...)
@app.route('/<path>')
def get_info(path):
return do_file(path)


modules/big_file.py
from modules.sql import do_log

_info_file = None

def do_file(path):
do_log(f'запросили {path}')
return вернуть_инфу_из_файла(_info_file, path)

def _preload_file():
global _info_file
_info_file = загрузить_большой_файл()

_preload_file()

modules/sql.py
import deco

#результат выполнения этой функции вообще не интересует, и она должна быть в другом процессе
@deco.concurrent(processes=1)
def do_log(text)
запихнуть_текст_в_sql(text)

вот и вопрос - do_log висит себе в отдельном процессе, это видно по списку процессов - в момент первого обращения к ней спавнится отдельный процесс. только вот по объему занимаемой памяти этот процесс равен основному, что мне дико не нравится.
понимаю, что, возможно, так в питоне не делают (это по сути первая прога, которую я на нем пишу), но как это делают правильно - не могу найти.

Отредактировано zarty (Янв. 31, 2018 14:18:53)

Офлайн

#6 Янв. 31, 2018 20:12:49

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

вопрос про многопоточность и ненужные процессу данные

zarty
в коде там нечто такое (работает под gunicorn):
Не большой спец по этим вопросам. Но посоветую смотреть не в сторону жалкого лога а в сторону gunicorn. Насколько я понимаю он создает пул процессов для обработки сообщений. У вас в каждом процессе будет по экземпляру файла. Хорошо что их пока только два экземпляра.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version