Как сервер LuaSocket может обрабатывать несколько запросов одновременно? - PullRequest
1 голос
/ 19 февраля 2011

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

while true do
local client = server:accept()
coroutine.resume(coroutine.create( function()
GiveMessage( client )
end ) )
end

Этот код, по-видимому, на самом деле не принимает более одного клиентского сообщения одновременно. Что не так с этим методом? Спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 19 февраля 2011

Вы не сможете создать истинную одновременную обработку только с сопрограммами - сопрограммы предназначены для кооперативной многозадачности. Одновременно выполняется только одна сопрограмма.

Код, который вы написали, ничем не отличается от вызова GiveMessage() в цикле напрямую. Вам нужно написать диспетчера сопрограмм и найти разумную причину для выхода из GiveMessage() для такого подхода к работе.

Существует как минимум три решения, в зависимости от специфики вашей задачи:

  • Создает несколько форков вашего сервера, обрабатывает операции в сопрограммах на каждом форке. Управляйте сопрограммами либо с помощью Copas , либо с помощью lua-ev , либо с помощью доморощенного диспетчера, в этом нет ничего плохого. Я рекомендую этот способ.

  • Используйте состояния Lua вместо сопрограмм, сохраняйте пул состояний, пул рабочих потоков ОС и очередь задач. Выполняйте каждую задачу в свободном состоянии Lua со свободным рабочим потоком. Требует некоторого низкоуровневого кодирования и более сложен.

  • Ищите существующие более специализированные решения - их несколько, но для советов по этому вопросу мне нужно лучше знать, какой тип сервера вы пишете.

  • Что бы вы ни выбрали, избегайте использования одного состояния Lua из нескольких потоков одновременно. (Возможно, с правильным количеством кода, но плохой идеей.)

0 голосов
/ 19 февраля 2011

Сопрограммы AFAIK не очень хорошо играют с luaSocket из коробки.Но есть Copas , которые вы можете использовать.

...