This is a mobile optimized page that loads fast, if you want to load the real page, click this text.

Мануал Уменьшаем нагрузку на 50% в моде RedAge (NeptuneEvo)

IronPython

Специалист
high coder
7 Ноя 2020
169
64
82
Ну так-то можно ж как-то структурировать это все, разные уровни - в разные места, например что-то ценное в БД, а какие-то мелочи в файлы, плюс это все по датам и времени сортировать
 

Vernetti

Активный участник
23 Янв 2022
19
11
28
28
Я соглашусь с тобой, все можно если нужно, если захотеть.
Говорят же если сильно захотеть, можно в космос полететь)
 

IronPython

Специалист
high coder
7 Ноя 2020
169
64
82
Согласен, все зависит от задачи и хотелок клиента Ну а если клиент не будет юзать логи то зачем заморачиваться - забросил в файл или бд и все...
 

DaVilka

Гуру
16 Сен 2020
608
231
108
в xml пишешь и читай сколько душе угодно. Первый раз в жизни вижу что бы логи хранились в бд
 
Реакции: IronPython

DaVilka

Гуру
16 Сен 2020
608
231
108

DaVilka

Гуру
16 Сен 2020
608
231
108
Редаговец это как школота, это не возраст и уровень знаний, а состояние души )
 
Реакции: IronPython

Vernetti

Активный участник
23 Янв 2022
19
11
28
28
Ну я конечно имел ввиду какую нибудь it компанию, а не сервер на ярости xD

Но раз твоя планка так высоко стоит, я промолчу
 

DaVilka

Гуру
16 Сен 2020
608
231
108

lovesmurf

Активный участник
11 Май 2022
15
0
36
Пздц, поддержу DaVilka. Нах непонятные логи грузить в базу данных, окей, если за бабло чет отвечает - ок.
На js к примеру, мне кажется вполне хватит условного винстона. Если че можно и сочинить чтоб логи в json / js объект записывать. Ну, а если хочется куда-то на сайт в пу выводить, вполне можно и через редис сделать. Или вообще сделать чтоб бот в телегу слал логи
 

xtance

Начинающий специалист
14 Ноя 2020
4
3
64
Не, ну, как бы было понятно, что дела в моде идут хуево
Но это уже за гранью добра и зла
По-моему фиксами тут уже ничего не исправить
работает на редаге
Оказывается замена логотипов на свои теперь работа
 

lazare13

Участник портала
9 Мар 2023
4
0
23
У вас нет фиксированной версии? Или кто-то продает?
 

Harland David Sanders

Куратор портала
Автор темы
Команда форума
Куратор портала
VIP
high coder
media
10 Сен 2020
3,071
2,472
219

zar

Участник портала
10 Апр 2023
1
1
23
Ради интереса откопал изначальную версию кода:
C#:
while (true)
{
    if (queue.Count < 1) continue;
    else
        MySQL.Query(queue.Dequeue());
}

Да, действительно, такого вида while(true) приведёт к сжиранию 100% CPU thread'а, так как проверка содержимого очереди будет проходить бесконечно.
Классическое решение этой проблемы — добавление Thread.Sleep(), который разгрузит процессор и укажет шедулеру, что данный поток/воркер не нужно выполнять на CPU в течение долгого времени. Получается, что код можно поправить всего лишь несколькими строчками:
C#:
while (true)
{
  /* Sleep if queue is empty */
  if (queue.Count < 1)
  {
    Thread.Sleep(500);
    continue;
  }

  /* Run all queries from queue */
  while (queue.Any())
    MySQL.Query(queue.Dequeue());
}

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

Однако что решение с таймером, что с sleep'ом страдает от одной и той же проблемы: всегда будет совершенно ненужная задержка с момента добавления новой строки в очередь логов, варьирующаяся от 0 до 500 мс.
На мой взгляд, наилучшем решением будет использование BlockingCollection<string> вместо Queue<string>. Тогда вместо queue.Dequeue() мы будем вызывать bc.Take(), который «заблокирует» тред, т.е. переведет его в blocking state, а значит
а) тред не будет израсходывать CPU time до того момента, пока в коллекцию не придёт новый элемент
б) ОС мгновенно разблокирует тред в момент, когда какой-либо другой тред таки добавит в нашу новую «очередь», построенную на BlockingCollection, новое значение, а значит и добавление новых логов в БД произойдёт мгновенно.

Таким образом, код можно упростить практически до (конечно, стоило бы проверить вернувшееся значение из .Take() и обернуть это в try catch{}, как это сделано в примере из документации выше):
C#:
while (true)
{
  MySQL.Query(bc.Take());
}
 
Реакции: Harland David Sanders

ready to massacre

Активный участник
4 Мар 2023
153
92
40

mob1ck

Новый участник
16 Сен 2023
2
0
3
Что-то в редаге v3 такого нет ничего. Поч?