Quiz Memorial Forum

Welcome Guest ( Log In | Register )

 
Reply to this topicStart new topic
> Разгоняем еггдропа
Kreon
post May 30 2006, 08:08 PM
Post #1


Developer
******

Group: Root Admin
Posts: 396
Joined: --
From: Внешние пределы
Member No.: 2



QUOTE
Я ещё не упоминал о том что внутренности eggdrop'a представляют собой далеко не образец написания хороших программ? Значит самое время рассказать об этом.

Вы обращали внимание как меееееедленно работают всякие скрипты, получающие информацию с интернет серверов, преобразующие её и выдающие в том или ином виде пользователю irc? Да, обращали? Сейчас попробую пояснить почему так происходит.

Данная часть будет интересна скорее с точки зрения программиста, чем пользователя. Если Вас не интересуют технические детали -- можете смело её пропустить взять патч и попробовать вкачать боту допинг =).
Итак, посмотрим файл: eggrop1.6.17/src/main.c, строки 934-940

CODE
...
while (1) {
int socket_cleanup = 0;
#ifdef USE_TCL_EVENTS
/* Process a single tcl event */
Tcl_DoOneEvent(TCL_ALL_EVENTS | TCL_DONT_WAIT);
#endif /* USE_TCL_EVENTS */
...


И ещё кусочек из eggrop1.6.17/src/net.c, строки 612-637

CODE
...
/* timeout: 1 sec */
t.tv_sec = 1;
t.tv_usec = 0;
...
x = select((SELECT_TYPE_ARG1) fds, SELECT_TYPE_ARG23 &fd,
SELECT_TYPE_ARG234 NULL, SELECT_TYPE_ARG234 NULL,
SELECT_TYPE_ARG5 &t);
...


Вот, не вдаваясь в детали это работает следующим образом -- вызывается функция TCL API Tcl_DoOneEvent, которая смотрит очередь событий интерпретатора TCL и если там есть оные вызывает обработчик для ОДНОГО события и удаляет его из очереди (подробнее смотри документацию на TCL). Затем уходит на участок кода из net.c, где функция select ждёт события от сокетов и выходит сразу если события есть или ждёт секунду, по истечении которой выходит принудительно сообщая о том, что событий не было.

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

Чем руководствовались разработчики eggdrop когда сделали только один вызов Tcl_DoOneEvent я знать не могу, но предполагаю что это попытка обезопасить себя от кривых скриптов, которые потребляют слишком много времени для обработки одного события. Хотя и это мне не кажется достаточно веским основанием. Думаю не ошибусь, если скажу что основные свои функции бот выполняет всё таки с помощью скриптов, поэтому такой акцент в сторону обработки событий от сети мне не очень понятен (ладно бы это был сервер с сотнями и тысячями клиентов). А посему, прекращая излишнюю болтовню я сделал чтобы за один раз у меня обрабатывалось 20 событий (если они есть конечно =)
Привожу кусочек кода из main.c где я внёс изменения:

CODE
#ifdef USE_TCL_EVENTS
/* Process tcl events, but no more than DO_QUEUED_EVENTS_CHUNK */
#define DO_QUEUED_EVENTS_CHUNK 20
{
int i;
for (i = 0; i < DO_QUEUED_EVENTS_CHUNK; i ++) {
if (!Tcl_DoOneEvent(TCL_ALL_EVENTS | TCL_DONT_WAIT))
break;
}
}
#endif /* USE_TCL_EVENTS */


Собираем бота и наслаждаемся реактивными ответами на запросы к скриптам использующих асинхронные события. Возьмите для теста скрипты получения погоды или гороскопа.
Впрочем, с кривонаписанными скриптами это может привести к ухудшению ситуации =) Будьте внимательны и осторожны - взлетаем =)


((с) xirc.ru)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
LesbiAnka
post Jun 1 2006, 11:29 AM
Post #2


Посетитель
*

Group: Members
Posts: 7
Joined: --
Member No.: 29



все клево конечно вапрос один... патч этот куда угодно класть? и просто собрать бота и все?
Кто уже поставил как себя ведут скрипты?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Kreon
post Jun 1 2006, 11:45 AM
Post #3


Developer
******

Group: Root Admin
Posts: 396
Joined: --
From: Внешние пределы
Member No.: 2



Либо положить патч в корень с исходниками еггдропа и набрать patch -p0 < eggdrop.fast2.diff, дальше собирать как обычно. Либо найти в исходниках упомянутые выше файлы и заменить приведенные из них строки. Потом так же пересобрать.
Что насчет того, как ведут себя скрипты... Ну, это зависит от скриптов. icq.tcl (тот, который организует подключение еггдропа к аське и позволяет сделать icq-бота на базе еггдропа) после такого патча стал работать в несколько раз шустрее. Ибо там на элементарном приеме/отправке сообщений требуется осуществление нескольких взаимодействий с сервером аськи, и раньше бот между каждым из них ждал по секунде. Не самое разумное решение, верно?
Думаю, что в каком-нибудь gismeteo.tcl при одиночном запросе разницы заметно не будет никакой - но другое дело при одновременных запросах с разных скриптов разных данных.

В новых версиях патча и сборках бота этот патч уже включен и его устанавливать отдельно нет необходимости.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 User(s) are reading this topic (2 Guests and 0 Anonymous Users)
0 Members:

 



Lo-Fi Version Time is now: 29th March 2024 - 01:47 AM
Design by GPF © 2006