LINUX.ORG.RU

Event Loop'ы в Perl - это...

 , ev,


1

2

кооперативная многозадачность в рамках одного процесса.

Это значит, что в рамках одного процесса:

1) Пока один асинхронный обработчик не завершится - другой не запустится;

2) Факт наступления нового события выявляется исключительно между запуском асинхронных обработчиков, время выполнения которых в худшем случае может быть непредсказуемым. Это значит, что если событие требует реакции от приложения за разумное время (пример: подключение на сокет) - его можно и прошляпить ненароком;

3) «Зато» в асинхронном обработчике A0 невозбранно можно пользоваться любыми глобальными переменными (до первого асинхронного вызова A1 внутри данного А0 - даже если A0 блокируется в ожидании результатов A1) и вообще мало задумываться о том, что приложение не вполне последовательно выполняется.

Я почитал доки по libev, ну и в целом не первый год пишу код с использованием AnyEvent+EV и Mojolicious (на самом деле те же AnyEvent+EV) - вроде всё так и есть...

Прошу поправить/опровергнуть меня и/или дополнить. Спасибо!

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

(пример: подключение на сокет) - его можно и прошляпить ненароком;

можно длину очереди увеличить

annulen ★★★★★
()
Ответ на: комментарий от annulen

А не знаешь, если в приложении не предусмотрен обработчик «события» idle, то... что делает event loop в то время, когда вообще нечего обрабатывать?

Просто было бы логично иметь хотя бы опциональную возможность отдавать управление в ОС самостоятельно до истечения отведённого процессу кванта времени. Это полезно в случае с префоркнутыми воркерами: если у тебя нет заданий от главного процесса, то передай управление ОСи досрочно, а не жди: ведь вполне вероятно, что твой квант времени мог бы пригодиться другим процессам, которым есть, что обрабатывать!

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

висит на select/poll/etc до наступления следующего события или таймаута, ОС в это время отправляет процесс в спячку

annulen ★★★★★
()
Ответ на: комментарий от annulen

Т.е. я правильно понимаю, что в момент вызова select'а процесс «подписывается» на появление в очереди новых событий для него и фактически прерывается, после чего «подписавшийся» процесс будет возвращён в очередь активных, только если сработает обработчик (на стороне ядра?) и впихнёт в очередь событий что-то вроде: произошло событие «будильник» для процесса с PID=1234.

После чего ОС как-то должна понять, что в очереди событий появилось что-то новое для PID=1234 - а значит, его нужно вернуть в очередь активных, повысив ему приоритет.

А как??

DRVTiny ★★★★★
() автор топика
Последнее исправление: DRVTiny (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

Может быть, есть какая-то дока, растолковывающая такие вещи человеческим языком?

А то слишком много штуковин в IT, умудряющихся вроде бы простые вещи объяснять так, что моя старая книжка по Ассемблеру кажется по сравнению с ними каким-то Чипполино :)

DRVTiny ★★★★★
() автор топика
Последнее исправление: DRVTiny (всего исправлений: 1)
Ответ на: комментарий от DRVTiny

Т.е. я правильно понимаю, что в момент вызова select'а процесс «подписывается» на возврат из обработчиков событий и фактически прерывается, после чего процесс будет возвращён в очередь активных, только если сработает обработчик (на стороне ядра?) и впихнёт в очередь событий что-то вроде: произошло событие «будильник» для процесса с PID=1234.

Да, правда не весь процесс, а только текущий поток

Читай man 2 select, man 2 poll

После чего ОС как-то должна понять, что в очереди событий появилось что-то новое для PID=1234 - а значит, его нужно вернуть в очередь активных, повысив ему приоритет.

Приоритет не меняется, поток просто переходит из «State S (Sleeping)» в «State R (Running)», и ему начинают выделяться кванты процессорного времени. Если у него стоит реалтаймовый планировщик то могут даже досрочно разбудить, прервав менее важный процесс

А как??

Что именно неясно?

annulen ★★★★★
()
Ответ на: комментарий от DRVTiny

Я читал урывками по мере надобности маны сисколлов, маны ядра Linux и местами немножно его код, насчет книжек не специалист

annulen ★★★★★
()
Ответ на: комментарий от DRVTiny

в момент вызова select'а процесс «подписывается» на появление в очереди новых событий для него и фактически прерывается

Почти, но нет.

Вот есть у тебя сокет, делаешь ты на нём recv(), и твой процесс блокируется, пока не придут данные. А если ты хочешь слушать сразу десять сокетов, просто звать recv() не получится, потому что первый же заблокируется. Вместо этого зовут select, poll или аналоги. Он блокируется до тех пор, пока по какому-нибудь сокету не придут данные. Список сокетов, на которых ты ждёшь, передаётся при вызове select.

i-rinat ★★★★★
()

было бы логично иметь хотя бы опциональную возможность отдавать управление в ОС самостоятельно до истечения отведённого процессу кванта времени

Отдавай, кто тебе мешает? Можно через софт-треды, можно через генераторы. И не в ОС конечно, а в евент луп.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.