Size: a a a

2021 September 06

S

Snusmumriken in pro.lua
Конечный результат охренителен, инфа сотка.
источник

S

Snusmumriken in pro.lua
Вот ета штука кстати называется "пул потоков", типа "в мейн-треде раскидываем задачи по свободным воркерам из пула, те делают работу, возвращают результаты, дозаполняем воркеры всякой фигнёй". Без пула, оно на завале задачами может самую малость перегрузить системку, а так получается нормальная очередь с параллельным исполнением. Но вот то что большая часть тредов занимаются ожиданием ввода-вывода ломает малину, хоть и круче по возможностям очистки стеков/убийству потоков/невозможности зафакапить тред.
источник

ДХ

Дима Х. in pro.lua
@kraftwerk28 @Snusmumriken @smertig @moteus писал неделю назад сюда по поводу передачи коннекшена к БД из с++ в Lua. видел ваши предложения, попробовал, но в итоге оказалось, что мою задачу нужно было решать вообще иначе (использовать динамическую lsqlite3 вместо статической). Но в любом случае спасибо большое за помощь.
источник

S

Snusmumriken in pro.lua
А в чём принципиальная разница? У тебя там были баги какие-то? В целом, статика и динамика не должны иметь принципиальной разницы.
источник

ДХ

Дима Х. in pro.lua
Моя проблема заключалась в том, что у меня при закрытии коннекшена в Lua исчезал WAL файл базы данных SQLite. Как выяснилось, проблема была вызвана тем, что с++ использовал один инстанс sqlite3 библиотеки (версия 3.27.2, статическая), а LUA использовал другой инстанс sqlite3 библиотеки (версия 3.24.0 - из lsqlite3 версии 0.9.5, а именно lsqlite3complete, то есть статическая lsqlite3).

Решение проблемы оказалось в том, чтобы использовать динамическую версию lsqlite3, которая линкуется динамически с libsqlite3.so, а также в с++ использовать динамическую версию sqlite3. Тем самым и LUA и с++ будут использовать один и тот же инстанс sqlite3.
источник

ДХ

Дима Х. in pro.lua
Для меня было неочевидно, что во-первых у меня в Луа используется другая версия sqlite3 библиотеки, а во-вторых, что 2 разных инстанса библиотеки могут приводить к таким проблемам. Поэтому казалось, что решением будет общим коннекшеном пользоваться
источник

S

Snusmumriken in pro.lua
А, ну так два инстанса. Я как раз предлагал выгружать в луа инстанс твоей плюсовой библиотеки с метатаблицей провешенных плюсовых функций, фактически забиндить плюсовую либу в луа. И использовать буквально один хендлер и для плюсов и в луа.
источник

ДХ

Дима Х. in pro.lua
А, окей. Я видимо не так понял предложение. Спасибо)
источник
2021 September 07

I

Igor725 in pro.lua
Ну, я на сишке когда сервер писал для игры, по интернетам рылся, искал, как лучше сделать. Не придумал ничего круче, кроме как при каждом удачном accept'e создавать структуру "Client" и в неё писать дескриптор сокета, ну а после вызвать pthread_create (или CreateThread, в зависимости от системы) и в поток передавать эту структуру. А поток уже делал с ней грязные делишки, принимая инфу от сокета и записывая её в структуру.
источник

I

Igor725 in pro.lua
Переслано от Tverd
Обычно делается не так. Создаются потоки, один висит в ацепте, как получил дескриптор, отдает его в очередь и кто свободен - забирает. Ибо создание потока, если мы о system thread, довольно тяжёлая задача
источник

I

Igor725 in pro.lua
Переслано от Tverd
А недавно в линухи запилили фичу, что могут сами воркеры висеть в ацепте и если один схватил соединение, остальные не просыпаются. Раньше все посыпались
источник

I

Igor725 in pro.lua
Переслано от Tverd
Но это надо включать
источник

I

Igor725 in pro.lua
Переслано от Tverd
Ну а высший пилотаж создавать треды, в которых работа идёт через асинхронщину
источник

I

Igor725 in pro.lua
В итоге все сокеты получились блокирующими и не мешают друг-другу. Пришлось ещё, правда, костыль один навертеть, если клиент в вебе запускался, то соединение шло в вебсокетах, а не на сыром TCP, сделал в начале потока цикл из 10 шагов, который recv вызывает с флагом MSG_PEEK и ждёт "GET /", если дождался - делаем хендшейк вебсокетный и запускаем цикл получения сообщений, если не было "GET /", то как обычного клиента.
источник

S

Snusmumriken in pro.lua
Это дичайше древняя технология, создавать тред под клиента. Первая попытка сделать так, чтобы "подсоединённый клиент не блокировал других клиентов". Правда, количество тредов обычно ограничивается цифрами 100/1000, иначе слишком много ресурсов начинает тратиться на переключение тредов и процесс становится ещё медленнее чем при однопоточке.
источник

I

Igor725 in pro.lua
Ну, справедливости ради стоит заметить, что и протокол игры сам по себе древний. Каждому игроку присваивается id, который описывается сигнед байтом.
источник

I

Igor725 in pro.lua
Так что в худшем случае будет 127 клиентов
источник

I

Igor725 in pro.lua
Я думал переписать на select/poll, но не придумал, как лучше всего это сделать
источник

I

Igor725 in pro.lua
А вот, собственно, и сам протокол. Тут даже динамического размера данных нет, везде статика https://wiki.vg/Classic_Protocol
источник

I

Igor725 in pro.lua
Строки и те фиксированные по 64 байта.
источник