LuaLanes i LuaSockets

Pracuję nad małą aplikacją Lua (pod Lua dla Windows, jeśli to ma znaczenie), która używa gniazd do komunikacji ze światem zewnętrznym. (LuaSocket)

Próbuję równolegle wysyłać kilka żądań. Pomyślałem więc, że LuaLanes jest najlepszym rozwiązaniem. (Jestem oczywiście otwarty na alternatywy, jeśli istnieje lepsze rozwiązanie, ale wolałbym nie zajmować się tym).

Coś takiego:

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])

GdzielaneTest funkcja jest zdefiniowana następująco:

function laneTest (id)
    local client = allClients [id]
    print ('peer: ', client:getpeername())
end

Moim problemem jest to, że w środkulaneTest funkcja, gdy uruchamiany jako pas, otrzymuję ten piękny komunikat o błędzie:

spróbuj zaindeksować lokalnego „klienta” (wartość userdata)

(z liniiclient:getpeername())

Więc ... Nie jestem pewien, co tu się dzieje? Czy tory są niekompatybilne z gniazdami, czy robię coś bardzo złego?

Wydaje mi się, że wersja pasów, które są dostarczane z Lua dla Windows, jest starożytna (luaforwindows) i nie działa z gniazdami, ale najnowsza wersja może? (Pasy 2.0.4 a nowsze 3.xx)

Naprawdę nie wiem, jak zaktualizować wersję Lanes, którą mam, inaczej już bym to wypróbował. Byłbym wdzięczny za każdą radę, jeśli w tym miejscu mógłbym się zmierzyć, lub jest coś bardziej oczywistego, że zrobiłem źle.

Edytować: Poszedłem do przodu i zainstalowałem pasy ruchu przez luarocks i mam ten sam problem, używając pasów 3.1.6-1, które są zainstalowane jako skała.

Edytuj 2: Próbowałem tego (i nadal się nie udało):

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])
To nie powiedzie się:attempt to call global 'require' (a nil value)Usuwanierequire ('socket') linia wewnątrz funkcji i ponawianie próby również nie powiedzie się, mówiąc:attempt to index local 'client' (a userdata value)

Z góry przepraszam za brak oczywistości, ale ... jak zdobyć gniazda do pracy z pasami?

Edytuj 3:

Cóż, edytuję to na przyszłość :)

O ile wiem, nie ma możliwości użycia pasów z gniazdami bez łatania luasockets. Zobacz dyskusjętutaj po więcej informacji; ale w skrócie (i jak wyjaśniono w odpowiedzi Deco): pasy nie działają z danymi użytkownika. luasocket nie zapewnia żadnego innego sposobu dostępu do informacji o gniazdach / gniazdach.

Nie mam ochoty na łatanie luasocket tak bardzo, jakbym miał raczej używane pasy, idę dalej i trzymam się copas lub couroutines.

Dziękuje wszystkim!

questionAnswers(2)

yourAnswerToTheQuestion