Luasocket сервер - останавливает выполнение кода

Страницы: 1
RSS
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
 
Есть исправно работающий обработчик стаканов.
Хочется прикрутить вывод информации из Quik в сторонние приложения по средством организации передачи данных через socket сервер.
Постоянно запускающаяся зацикленная  функция вызываемая из main производит обработку и складирование данных в массив.
Socket сервер - должен периодически выдавать эту информацию по запросу подключившегося клиента.

Для запуска в Quik сервера используется библиотека luasocket (под lua 5.4.1).
Запуск ожидания коннекта ServerRun() - так же запускается из main.
При этом после выполнения server:accept() - выполнение какого либо кода прекращается.
Прекращается до тех пор пока на сервер не поступит запрос - он не выдаст ответ и только тогда функция table.load(var, 1000) будет запущена повторно.
И тоже застопорится до поступления следующего запроса от socket клиента.
client:settimeout(2) - должен вроде как прерывать ожидание коннекта и закрывать коннект - что поспособствовало бы продолжению выполнения иного кода, но этого не происходит.
Пробовал многое - но ничего не помогло. Где бы в коде не запускалась server:accept() - она останавливает выполнение любых других функций.
Как организовать запуск table.load(var, 1000) и ServerRun() - в раздельных потоках - так чтобы выполнение одной функции не останавливалось на период работы другой ?
Код для примера (сильно сокращён)

Код
socket = require("socket")

IPAddr = "127.0.0.1" --IP Адрес
IPPort = 3585       --IP Port    
client = nil

function main()
   while is_run do
 
   table.load(var, 1000)
end
ServerRun()
end


function ServerRun()
while is_run do
  client = server:accept()
  client:settimeout(2)
    local line, err = client:receive()
    local result = evalString(line)
    if not err then client:send(result.."\n") end
   client:close()
end
end

function OnInit(quik_path)
server = assert(socket.bind("127.0.0.1", IPPort))
end
 
Как правильно сделать ожидание коннекта функцией server:accept() - чтоб она прерывалась при отсутствии подключённого клиента ?
Или как в принципе в quik lua запускать асинхронно функции ?Асинхронный запуск функций вообще возможен ?
 
Цитата
Boris написал:
uasocket
см док:
Используйте метод settimeout или accept может блокироваться до тех пор, пока не появится другой клиент.
 
Цитата
nikolz написал:
Цитата
Boris написал:
uasocket
см док:
Используйте метод  settimeout  или accept может блокироваться

Так в коде мною приведенном посмотрите - settimeout там есть, те мною используется.
И применял я его в разных режимах b t
Не помогает это !

Или вы о каком то то другом использовании settimeout Тогда поясните пожалуйста...
 
Код
 client = server:accept()
  client:settimeout(2)

(2) - по логике server:accept() должна ожидать коннекта клиента 2 сек и при не поступлении запроса от клиента завершиться сама собой.
Но она этого не делает - продолжает ждать останавливая весь код.
 
код не исполняется далее строки  client = server:accept()
Даже строка client:settimeout(2) - не выполняется.
 
   
Чистый Lua синхронный, максимум что есть - это корутины. Можно попробовать использовать внешние библиотеки, обеспечивающие асинхронность.

Можете попробовать корутины, вот классчический пример для HTTP, который сразу находится по запросу "Lua socket asynchronous calls":
Хотя, наверно, уже пробовали.
Код
function download (host, file, port)
    port = port or 80
    print (host, file, port)
    local connectStatus, myConnection = pcall (socket.connect,host,port)
    if (connectStatus) then
        myConnection:settimeout(0.01) -- do not block you can play with this value
        local count = 0 -- counts number of bytes read
        -- May be easier to do this LuaSocket's HTTP functions
        myConnection:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
        local lastStatus = nil
        while true do
            local buffer, status, overflow = receive(myConnection, lastStatus)
            -- If buffer is not null the call was a success (changed in LuaSocket 2.0)
            if (buffer ~= nil) then
                 io.write("+")
                 io.flush()
                 count = count + string.len(buffer)
            else
                print ("\n\"" .. status .. "\" with " .. string.len(overflow) .. " bytes of " .. file)
                io.flush()
                count = count + string.len(overflow)
            end
            if status == "closed" then break end
                lastStatus=status
            end
        myConnection:close()
        print(file, count)
    else
        print("Connection failed with error : " .. myConnection)
        io.flush()
    end
end

threads = {} -- list of all live threads

function get (host, file, port)
    -- create coroutine
    local co = coroutine.create(
        function ()
            download(host, file, port)
        end)
    -- insert it in the
    table.insert(threads, co)
end

function receive (myConnection, status)
    if status == "timeout" then
        print (myConnection, "Yielding to dispatcher")
        io.flush()
        coroutine.yield(myConnection)
    end
    return myConnection:receive(1024)
end

function dispatcher ()
    while true do
        local n = table.getn(threads)
        if n == 0 then break end -- no more threads to run
        local connections = {}
        for i=1,n do
            print (threads[i], "Resuming")
            io.flush()
            local status, res = coroutine.resume(threads[i])
            if not res then -- thread finished its task?
                table.remove(threads, i)
                break
            else -- timeout
                table.insert(connections, res)
            end
        end
        if table.getn(connections) == n then
            socket.select(connections)
        end
    end
end

host = "www.w3.org"
get(host, "/TR/html401/html40.txt")
get(host,"/TR/2002/REC-xhtml1-20020801/xhtml1.pdf")
get(host,"/TR/REC-html32.html")
get(host,"/TR/2000/REC-DOM-Level-2-Core-20001113/DOM2-Core.txt")
dispatcher()
 
Цитата
Boris написал:
Есть исправно работающий обработчик стаканов.
Хочется прикрутить вывод информации из Quik в сторонние приложения по средством организации передачи данных через socket сервер.
Постоянно запускающаяся зацикленная  функция вызываемая из main производит обработку и складирование данных в массив.
Socket сервер - должен периодически выдавать эту информацию по запросу подключившегося клиента.

Для запуска в Quik сервера используется библиотека luasocket (под lua 5.4.1).
Запуск ожидания коннекта ServerRun() - так же запускается из main.
При этом после выполнения server:accept() - выполнение какого либо кода прекращается.
Прекращается до тех пор пока на сервер не поступит запрос - он не выдаст ответ и только тогда функция table.load(var, 1000) будет запущена повторно.
И тоже застопорится до поступления следующего запроса от socket клиента.
client:settimeout(2) - должен вроде как прерывать ожидание коннекта и закрывать коннект - что поспособствовало бы продолжению выполнения иного кода, но этого не происходит.
Пробовал многое - но ничего не помогло. Где бы в коде не запускалась server:accept() - она останавливает выполнение любых других функций.
Как организовать запуск table.load(var, 1000) и ServerRun() - в раздельных потоках - так чтобы выполнение одной функции не останавливалось на период работы другой ?
Код для примера (сильно сокращён)

Код
  socket  =   require ( "socket" )

IPAddr  =   "127.0.0.1"   --IP Адрес 
IPPort  =   3585         --IP Port     
client  =   nil 

 function   main ()
    while  is_run  do 
 
    table.load (var,  1000 )
 end 
ServerRun()
 end 


 function   ServerRun ()
 while  is_run  do 
  client  =  server:accept()
  client:settimeout( 2 )
     local  line, err  =  client:receive()
     local  result  =  evalString(line)
     if   not  err  then  client:send(result .. "\n")  end 
   client:close()
 end 
 end 

 function   OnInit (quik_path)
server  =  assert( socket.bind ( "127.0.0.1" , IPPort))
 end 
  
У вас сервер запускает когда main завершает работу.
Т е если main работает то сервер не запускается
Вы должны его вставить в цикл main
 
Цитата
nikolz написал:
У вас сервер запускает когда main завершает работу.Т е если main работает то сервер не запускаетсяВы должны его вставить в цикл main
в main есть вызов ServerRun().

Функция вызывается - доходит до строки client  =  server:accept() и вешает весь остальной код.
Сервер при этом работает - по любому запросу моментально отвечает клиенту.

Но проблема что до тех пока клиент не придёт и не запросит данные никакие другие функции lua - включая сборщика статы table.load (var,  1000 ) не исполняются.

Если вы о том что необходимо сделать так


Код
function   main ()
    while  is_run  do 
 
    table.load (var,  1000 )
 end 

while  is_run  do 
  client  =  server:accept()
  client:settimeout( 2 )
     local  line, err  =  client:receive()
     local  result  =  evalString(line)
     if   not  err  then  client:send(result .. "\n")  end 
   client:close()
 end 

 end 
Или даже вот так:
Код
function   main ()
    while  is_run  do 
 
    table.load (var,  1000 )

  client  =  server:accept()
  client:settimeout( 2 )
     local  line, err  =  client:receive()
     local  result  =  evalString(line)
     if   not  err  then  client:send(result .. "\n")  end 
   client:close()

 end 
 end 

То в результате нет абсолютно никакой разницы - как только выполняется строка server:accept() - работает только сервер и ничто другое.
 
Какая у вас версия КВИК
 
У вас в main нет задержки поэтому сервер работает в цикле Main
Посмотрите загрузку процессора должно быть много.
 
поставьте sleep хотя бы на 100 ms
 
Цитата
nikolz написал:
Какая у вас версия КВИК
9.3.3.3 lua 5.4.1
до этого пробовал и lua 5.3.5 - с другой dll luasocket
думал что возможно dll глючная.
 
Цитата
nikolz написал:
поставьте sleep хотя бы на 100 ms
было - ставил
разницы не заметил тк в вызываемых из main функциях организована проверка на уже запущеный процесс
те повторно тот же процесс не запускается - до тех пор пока не завершится первый


на ситуацию с зависанием после server:accept() - не влияет
 
может есть кто живой на этой теме ?
 
Просто я нигде не могу найти луа сокет под 5.4.1 пожалуйста если не сложно скиньте ссылку где скачать
 
Цитата
abdula amin написал:
Просто я нигде не могу найти луа сокет под 5.4.1 пожалуйста если не сложно скиньте ссылку где скачать
https://github.com/alain-riedinger/luasocket/releases
https://disk.yandex.ru/d/wJ8I71eZ0vFT3w

скомпиллены по разному и под разный набор софта на ПК
 
Цитата
Boris написал:

 client   =   server:accept()
 client:settimeout(  2  ) [/CODE]

таймаут надо ставить на сервер
[QUOTE]
server:settimeout(2)
даже в гугле есть ответ
https://stackoverflow.com/questions/42445423/luasocket-serveraccept-timeout-tcp
Страницы: 1
Читают тему
Наверх