Найти тему
TheEVolk

Многопоточность в Lua - моя главная ошибка

Я разрабатывал бота ВК, который должен был отвечать огромной куче пользователей, но в линейном приложении это невозможно, ведь программа не возьмётся за новое сообщение, пока не закончит старое. В качестве решения проблемы я реализовал многопоточность на уровне ядра и немного модифицировал Lua в плане блокировки потоков в критических местах.

Первое время это работало хорошо, но с каждой единицей времени мне приходили всё более устрашающие ошибки. Программа могла вылететь в самых неприятных моментах и потерчть все данные или же какие-то переменные могли получить совершенно неожиданный результат.

Куда делась эта функция?
Куда делась эта функция?

Какая-нибудь глобальная переменная (да, у меня были ошибки и с архитектурой) могла изменить свое значение в следующей строчке кода.

Так же весьма неприятными были абсолютно ненормальные ошибки несоответствия переменных.

Мы просили сахар, а вы дали сахар
Мы просили сахар, а вы дали сахар

В добавок ко всему этому ужасу осмелюсь сказать, что большинство луа библиотек не предназначены для многопоточности:

Без комментариев...
Без комментариев...

Да, возможно я мог реализовать многопоточность и лучше, но всё равно будут вот такие оплошности. Еще пару скринов сущей несправедливости:

Ааааааа
Ааааааа
Отличная уязвимость
Отличная уязвимость

Решение

Чтож, а я вот знаю как решить вашу проблему: асинхронность. В том же JS есть отличный async/await, который отдаст управление дрцгим участкам кода, пока какая-нибудь операция в фоне делает свою работу.

Так же рекомендую основательно подойти к архитектуре проекта и понимать, к чему всё может привести.

Спасибо за внимание, жду ваших комментариев.