IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 424 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 430 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 436 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 459 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 424 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 430 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 436 of /sources/classes/bbcode/class_bbcode.php)
IPB WARNING [2] preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead (Line: 459 of /sources/classes/bbcode/class_bbcode.php)
Разгоняем еггдропа - Quiz Memorial Forum
Quiz Memorial Forum

Welcome Guest ( Log In | Register )

> Разгоняем еггдропа
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
 
Reply to this topicStart new topic
Replies

Posts in this topic
Kreon   Разгоняем еггдропа   May 30 2006, 08:08 PM
LesbiAnka   RE: Разгоняем еггдропа   Jun 1 2006, 11:29 AM
Kreon   RE: Разгоняем еггдропа   Jun 1 2006, 11:45 AM


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: 28th April 2024 - 02:31 PM
Design by GPF © 2006