Как сделать отдельные потоки в луа?

normalped

Участник
Автор темы
42
11
Нужно реализовать получение данных из пайтона в луа через сокет и в бесконечном цикле получать эти данные, но и чтобы остальной код не блокировался и игра не зависала.
Есть функция на пайтоне которая выполняет тоже самое через библиотеку threading, дабы создать отдельный поток для этой функции, как его написать на луа? Пробовал через lua_thread.create(function()) но чего то не помогает. Есть библиотека lua thread, которая вроде как делает то что нужно, но она просто для луа и на мунлоадер её не поставить (я в луа либах не разбираюсь, по этому может щас сказал бред)

Python:
received_data = None

def get_data():
    global received_data

    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(('127.0.0.1', 12345))
    server.listen(1)

    while True:
        conn, addr = server.accept()

        data = conn.recv(1024)
        received_data = data.decode()
        print(received_data)

        conn.close()

thread = threading.Thread(target=get_data)
thread.start()
 

normalped

Участник
Автор темы
42
11
попробуй сделать как в этой теме https://www.blast.hk/threads/188675, надо поставить таймаут сокета на ноль, тогда не будет зависаний
можно чуть подробнее пожалуйста, с луа не сильно дружу, куда вписывать таймаут?

Lua:
function get_data()
    local udp = socket.udp()
    udp:setsockname('127.0.0.1', 12346)
    udp:settimeout(0)
    while true do
        local data, msg_or_ip, port_or_nil = udp:receivefrom()
        if data then
            print("Получены данные: ", data)
        else
        end
    end
end
lua_thread.create(get_data)
 

kuzheren

Известный
428
203
можно чуть подробнее пожалуйста, с луа не сильно дружу, куда вписывать таймаут?

Lua:
function get_data()
    local udp = socket.udp()
    udp:setsockname('127.0.0.1', 12346)
    udp:settimeout(0)
    while true do
        local data, msg_or_ip, port_or_nil = udp:receivefrom()
        if data then
            print("Получены данные: ", data)
        else
        end
    end
end
lua_thread.create(get_data)
ты его уже вписал, и не обязательно вызывать функцию через lua_thread, можно засунуть в main содержимое функции
и еще добавь wait(0) в бесконечном цикле
 

normalped

Участник
Автор темы
42
11
ты его уже вписал, и не обязательно вызывать функцию через lua_thread, можно засунуть в main содержимое функции
и еще добавь wait(0) в бесконечном цикле
так типо?

Lua:
function main()
    local udp = socket.udp()
    udp:setsockname('127.0.0.1', 12345)
    udp:settimeout(0)
    while true do
        local data, msg_or_ip, port_or_nil = udp:receivefrom()
        if data then
            print("Получены данные: ", data)
        else
        end
    end
    wait(0)
end
 

MrDorlik

Известный
957
384
так типо?

Lua:
function main()
    local udp = socket.udp()
    udp:setsockname('127.0.0.1', 12345)
    udp:settimeout(0)
    while true do
        local data, msg_or_ip, port_or_nil = udp:receivefrom()
        if data then
            print("Получены данные: ", data)
        else
        end
    end
    wait(0)
end
ты не понимаешь что значит внутри цикла? в цикле - значит между "while true do" и "end"
 

normalped

Участник
Автор темы
42
11
ты его уже вписал, и не обязательно вызывать функцию через lua_thread, можно засунуть в main содержимое функции
и еще добавь wait(0) в бесконечном цикле
огромное спасибо, затупил сначала