Я разрабатывал бота ВК, который должен был отвечать огромной куче пользователей, но в линейном приложении это невозможно, ведь программа не возьмётся за новое сообщение, пока не закончит старое. В качестве решения проблемы я реализовал многопоточность на уровне ядра и немного модифицировал Lua в плане блокировки потоков в критических местах.
Первое время это работало хорошо, но с каждой единицей времени мне приходили всё более устрашающие ошибки. Программа могла вылететь в самых неприятных моментах и потерчть все данные или же какие-то переменные могли получить совершенно неожиданный результат.
Какая-нибудь глобальная переменная (да, у меня были ошибки и с архитектурой) могла изменить свое значение в следующей строчке кода.
Так же весьма неприятными были абсолютно ненормальные ошибки несоответствия переменных.
В добавок ко всему этому ужасу осмелюсь сказать, что большинство луа библиотек не предназначены для многопоточности:
Да, возможно я мог реализовать многопоточность и лучше, но всё равно будут вот такие оплошности. Еще пару скринов сущей несправедливости:
Решение
Чтож, а я вот знаю как решить вашу проблему: асинхронность. В том же JS есть отличный async/await, который отдаст управление дрцгим участкам кода, пока какая-нибудь операция в фоне делает свою работу.
Так же рекомендую основательно подойти к архитектуре проекта и понимать, к чему всё может привести.
Спасибо за внимание, жду ваших комментариев.