LuaLanes и LuaSockets
Я работаю над небольшим приложением Lua (под Lua для Windows, если это имеет значение), которое использует сокеты для связи с внешним миром. (LuaSocket)
И я пытаюсь сделать несколько запросов параллельно. Поэтому я подумал, что LuaLanes - это путь. (Конечно, я открыт для альтернатив, если есть лучшее решение, но предпочел бы не иметь дело с сопрограммами для этого.)
Что-то вроде этого:
server = assert (socket.bind ('*', 1234))
client = server : accept ()
-- set id to some unique value
allClients [id] = client
theLane = lanes.gen ("", laneTest) ( id )
print (theLane [1])
ГдеlaneTest
Функция определяется следующим образом:
function laneTest (id)
local client = allClients [id]
print ('peer: ', client:getpeername())
end
Моя проблема в том, что внутриlaneTest
функция, при запуске в качестве полосы движения, я получаю это прекрасное сообщение об ошибке:
попытка индексировать локальный «клиент» (значение пользовательских данных)
(с линииclient:getpeername()
)
Итак ... Я не уверен, что здесь происходит? Линии несовместимы с розетками, или я делаю что-то очень неправильно?
Я думаю, может быть, что версия переулков, которая поставляется с Lua для Windows, является древней (luaforwindows) и не работает с сокетами, но последняя версия может? (Дорожки 2.0.4 против более поздних 3.xx)
Я действительно не знаю, как мне обновить имеющуюся у меня версию Lanes, иначе я бы попробовал это сейчас. Буду признателен за любой совет, если это то, куда я мог бы пойти или есть что-то более очевидное, что я сделал не так.
редактироватьЯ пошел дальше и установил дорожки через luarocks, и у меня возникла та же проблема с дорожками 3.1.6-1, которые установлены в виде камня.
Редактировать 2: Пробовал это (и до сих пор не удалось)
require ('socket')
require ('lanes')
local allClients = {}
function theLane (id)
print ('the id:', id) -- correctly prints out the id passed to the function
local SOCKET = require ('socket')
local client = allClients [id]
print ('peer:', client:getpeername())
client : close ()
end
local server = assert (SOCKET.bind ('*', 1234))
local ip, port = server:getsockname ()
local laneFunc = lanes.gen('', theLane)
local client = server:accept ()
allClients [1] = client
local x = laneFunc (1)
print (x[1])
Это не утверждает:attempt to call global 'require' (a nil value)
Удалениеrequire ('socket')
Строка внутри функции и повторная попытка также проваливаются, говоря:attempt to index local 'client' (a userdata value)
Заранее извиняюсь за то, что упустил очевидное, но ... как вы получаете сокеты для работы с дорожками?
Изменить 3:
Ну, я редактирую это для дальнейшего использования :)
Насколько я могу судить, невозможно использовать Lanes с Sockets без исправления luasockets. Смотрите обсуждениеВот для больше об этом; но вкратце (и как объяснено в ответе Деку): полосы не работают с пользовательскими данными. luasocket не предоставляет другого способа доступа к информации о сокетах / сокетах.
У меня нет желания исправлять luasocket так, как я бы предпочел использовать полосы, я собираюсь идти вперед и придерживаться Copas или Couroutines.
Спасибо всем!