Lyonya Decart
Участник
- 140
- 22
Короче, вроде решил проблему с вылетами асинхронов, может кому пригодится:
Была проблема, что при использовании функции cover'a в цикле, вне зависимости от задержки и проверок, асинхроны улетали вместе с игрой в закат.
Колупался 4 дня, чтобы найти способы это пофиксить, делал жуткие костыли и не жуткие, ничего не помогало. Решении проблемы пришло само и совершенно простое.
Что мне помогло? Из функции асинхронного запроса cover'a я убрал создание потока, а саму функцию, содержащую асинхрон, запускал в другом потоке.
Другими словами получилось так:
Ваша функция с асинхронами:
Функция запроса от cover'a:Lua:function getAsync() -- ваша функция, содержащая асинхроны for i = 1, 100 do -- сам цикл. Пробовал и While и For и Repeat. Результат одинаковый - не вылетает. asyncHttpRequest('GET', "ваша ссылочка", nil, function(response) -- код ответа end, function(err) -- код ошибки sampAddChatMessage('{6600FF}Нет связи') end) end end
Вызов функции с асинхронами где-то внути кода:Lua:function asyncHttpRequest(method, url, args, resolve, reject) local request_thread = effil.thread(function (method, url, args) local requests = require 'requests' local result, response = pcall(requests.request, method, url, args) if result then response.json, response.xml = nil, nil return true, response else return false, response end end)(method, url, args) if not resolve then resolve = function() end end if not reject then reject = function() end end --lua_thread.create(function() -- здесь я и убрал поток local runner = request_thread while true do local status, err = runner:status() if not err then if status == 'completed' then local result, response = runner:get() if result then resolve(response) else reject(response) end return elseif status == 'canceled' then return reject(status) end else return reject(err) end wait(0) end --end) -- конец убранного потока end
Lua:lua_thread.create(function() --Ваш код getAsync() -- Ваш код х2 end) -- Либо lua_thread.create(getAsync)
Мне помогло, проработал скрипт 10 минут +-, дальше не стал проверять, работает, данные передаются в лучшем виде, фризов не наблюдал. Запускал до 5 циклов одновременно (с разными переменными и задачами, естественно), тоже работает без искажений и вылетов.
P.S. Интересно, что если запустить два разных потока с двумя функциями с асинхронами, вылетов тоже не замечается.
попробовал твой фикс, изначально вроде все норм было, а потом вылеты продолжились