Size: a a a

2021 November 10

🌌

🌌Na🌃CHT in Python
Мы тут уже курсов и книг на пару лет для новичка наговорили)
источник

楽園松本 in Python
Ещё мне нравится Прохоренок. Тоже быстрый старт, книга неплоха как справочник. Дейтел неплохие книги пишет, но у него упор именно на программирование и стратегии разработки ПО.
источник

РС

Родион Соловьев... in Python
Что-то я забылся... Пора проблемы писать

Вопрос про мультипроцессинг и логгирование.

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

Подробно
У меня бэкенд на fastapi, который работает на 8-ми процессах-worker'ах. Бэкенд логгирует всё, что делает с помощью loguru.
В силу того, что бэкенд работает круглосуточно и пишет много логов, то его log-файл очень сильно жиреет со временем.

loguru предоставляет для этого удобный инструмент в виде ротации (при желании со сжатием).
Чтобы каждый день писался новый log, настраиваю я это например так:
logger.add(sink='file.log', rotation='00:00:00') 
# для сжатия добавляется compression='zip'

После этого в полночь каждого дня начинает писаться новый log-файл, однако я не просто так упоминал про 8 процессов-worker'ов.
Из-за отсутствия синхронизации при малейших задержках каждый из процессов в момент ротации может создать себе собственный файл и единолично начать в него писать. Собирать потом цельный лог из разных файлов (особенно если они уже сжаты в архивы) не очень-то удобно.

Вот минимальный пример (голые процессы, без тяжёлых бэкендов), на котором эту проблему с высокой вероятностью можно увидеть:
import os
import sys
from datetime import timedelta
from glob import glob
from multiprocessing import Process
from time import sleep

from loguru import logger


def setup_logger() -> None:
   format = ("<green>{time:YYYY-MM-DD HH:mm:ss.SSS!UTC}UTC+00</green> | "
             "<red>PID={process: <8}</red> | "
             "<level>{level: <8}</level> | "
             "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>")

   logger.remove()
   logger.add(sink=sys.stderr, format=format)
   logger.add(sink='logs/two_process.log', format=format, rotation=timedelta(seconds=2))


def remove_all_previous_logs():
   files = glob('logs/*.log')
   for file in files:
       os.remove(file)


def task():
   for i in range(15):
       sleep(1)
       logger.debug(f'another iteration {i}')


if __name__ == '__main__':
   remove_all_previous_logs()
   setup_logger()

   logger.info("started")

   process_count = 8
   processes = [Process(target=task, ) for i in range(process_count)]
   for process in processes:
       process.start()
   for process in processes:
       process.join()


Собсна, вопрос: Как их синхронизировать ротацию (создание новых файлов в заданное время) чтобы избежать дублирования лог-файлов для каждого процесса?
источник

楽園松本 in Python
источник

楽園松本 in Python
Это моя дежурная подборка
источник

楽園松本 in Python
источник

楽園松本 in Python
источник

K

Kirill in Python
так зачем строка там
источник

DB

Dino Bambino in Python
+
источник

ap

artem po in Python
Есть яндекс практикум вводный курс и python и доп django
источник

🌌

🌌Na🌃CHT in Python
Очень серьезно, мое уважение!
Я бумажные версии не признаю, не имею ни одной бумажной книги, но такие как ты даёте мне сейчас работу хD так что спасибо
Перестала читать что-либо кроме документации на английском, когда устроилась техническим переводчиком, не вывожу ещё и в свободное время кодерские книжки читать
А документация это другое хD
источник

K

Kirill in Python
говно все ваши курсы
источник

🌌

🌌Na🌃CHT in Python
CS50 не говно уж точно
источник

🌌

🌌Na🌃CHT in Python
На русском тоже есть
источник

РС

Родион Соловьев... in Python
Тащем-то зарывшись в документацию loguru нашёл флаг enqueue=True.
На абстрактном примере выше он проблему решил, но полной уверенности, что тоже самое произойдёт с бэкендом у меня пока нет. Протестировать корректность в реальных условиях будет сложнее...
Посмотрим что получится
источник

🌌

🌌Na🌃CHT in Python
А как там с GIL? Имеет смысл ASGI-приложение именно на процессы делить?
источник

ap

artem po in Python
Люди интересуются с чего начать, начинать надо с бесплатного и доступного.
источник

a

augmentedCat in Python
Посмотри на закреп и не пиши ему ничего
источник

🌌

🌌Na🌃CHT in Python
+1
источник

a

augmentedCat in Python
楽園松本 не думаешь, что стоит его забанить? Он же явно хочет продавать их
источник