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.

Спасибо всем!

Ответы на вопрос(2)

Ваш ответ на вопрос