lua sockets&threads - Игра намертво зависает

xSkateboard

Активный
Автор темы
39
126
Версия MoonLoader
.026-beta
Приветствую всех.
У меня есть сервер на пайтон, который взаимодействует с клиентом - луа скрипт ML.
Пакеты из луа в пайтон идут отлично любой длины, а вот как добавил обработчик для запросов обратно сразу начались рофлы.
Если работает сервер, то игра намертво зависает. Если сервер вырубить, то отвисает соответственно. При этом сервер ничего не шлет.

Ниже прикрепляю часть кода, которая и вызывает зависания:
Lua:
function worker()
    while true do
        local packet_length, packet, data
        local success, err = pcall(function()
            packet_length = client:receive(4)
            if packet_length then
                local number = tonumber(packet_length)
                if number == nil then
                    print("Error: packet_length is not a number")
                else
                    packet_length = number
                    packet = client:receive(packet_length)
                    data = json.decode(packet) -- эта либа стоит если что
                end
            end
        end)
        if success then
            if data and data.event == "command" then
                --handleCommand(data.cmd, data.args)
                print("works")
            end
        else
            print("Error: ", err)
        end
        wait(10)
    end
end


function main()
    local mainThread = lua_thread.create(worker)
    while true do
        wait(0)
    end
end

Буду благодарен за помощь, впервые работаю с сокетами и потоками на луа
 
  • Грустно
Реакции: qdIbp

RedHolms

Известный
Проверенный
617
360
не копипасть, подредактируй, добавь пару require
Lua:
uriFormat = function(params)
   local uri = ''
   local prefix = ''

   for k, v in pairs(params) do
      uri = uri .. prefix .. tostring(k) .. '=' .. tostring(v)
      prefix = '&'
   end

   return uri
end

do
   local _thread_worker = function(method, url, args)
      local requests = require 'requests'
      local success, result = pcall(requests.request, method, url, args)
      if success then
         result.json, result.xml = nil, nil
         return { true, result }
      else
         return { false, result }
      end
   end

   makeRequest = function(method, url, args, successHandler, failHandler)
      local request_thread_runner = effil.thread(_thread_worker)
      lua_thread.create(function(method, url, args, successHandler, failHandler)
         local request_thread = request_thread_runner(method, url, args)

         local status, err
         while not err and status ~= 'completed' do
            status, err = request_thread:status()
         wait(0) end

         if err then
            return failHandler(0, err)
         else
            if status ~= 'completed' then
               return failHandler(1, status)
            end

            local retval = request_thread:get()
            local request_success, request_retval = retval[1], retval[2]

            if not request_success then
               return failHandler(2, request_retval)
            end

            request_retval.json = function(self)
               return decodeJson(self.text)
            end

            return successHandler(request_retval)
         end
      end, method, url, args, successHandler, failHandler)
   end
end
 
  • Нравится
Реакции: xSkateboard

xSkateboard

Активный
Автор темы
39
126
Проблема решена, ChatGPT помог с решением.
Нужно было всего лишь добавить следующую строку, чтобы сокеты не блокировали процесс:
Lua:
client:settimeout(0)
 
Последнее редактирование: