ImSoKolako
Пользователь
- Регистрация
- Авг 27, 2025
- Сообщения
- 2
- Тема Автор
- #1
Привет, разработчики! В данной статье я хочу рассказать вам о синхронном, асинхронном и параллельном программировании в роблокс луау.
Начинаем с теории. Синхронное программирование - это программирование, при котором все действия идут после друг друга, то есть вызвалась одна функция, поток ждёт пока эта функция закончит своё выполнение и вернёт какое-либо значение. В асинхронном программировании такая концепция нарушается и эта одна функция может вызваться в одно время, но начнёт своё выполнение в совсем другое время, но при этом не остановит поток. Сам же поток начнёт выполнение этой функции тогда, когда будет в режиме сна.
При параллельном программировании эта функция вызывается одновременно с другой функцией, но на совсем другом потоке и, чаще всего, другой виртуальной машине, благодаря чему можно задействовать несколько ядер системы.
Синхронное программирование, хоть и является достаточно безопасным, не имеет плюсов в производительности, а даже наоборот - только ухудшает её.
В роблоксе очень распространено асинхронное программирование, оно является средним уровнем между безопасностью и производительностью.
Бездумное использование асинхронного программирования может привести к массивной утечке памяти. Но об этом я расскажу позже. Сейчас же я расскажу как оно работает в роблоксе и луау.
В роблоксе нам дают целых две библиотеки для работы с асинхронностью. Это coroutine и task. Также есть и тип данных, обозначающий функцию, которая выполняется асинхронно - называется он, иронично, потоком. Кратко пробегусь по этим двум библиотекам.
Coroutine является более быстрой, т.к. взаимодействует только с Lua и C++. Имеет она всего три распространённых в использовании функции: create, resume и wrap. По названиям понятно, что create создаёт новый поток и возвращает его, но не запускает его, resume уже как раз таки его запускает. Wrap же создаёт поток и возвращает функцию, которая запускает этот самый поток.
Таск имеет четыре распространённых в использовании функции, это spawn, wait, defer и cancel. Спавн создаёт поток, запускает его и возвращает его, вейт останавливает поток на определённое кол-во секунд, однако он привязан к ивенту ран сервиса, так что он будет ожидать не идеальное кол-во времени. Дефер, это тоже самое, что и спавн, только происходит на конце текущего кадра. cancel, логично, отклоняет работу какого-либо потока.
Каждый поток весит немалое количество памяти, а также они не очищаются коллектором мусора пока они не перестанут работать (status == "dead"). То есть, вы должны предотвращать создание большого количества потоков и в принципе предотвращать использование функций, которые надолго останавливают код.
На практике такое программирование используется в более эффективных кастомных сигналах, а также там, где результат возвращения функции не важен.
Параллельное программирование в роблоксе основано на системе акторов (https://ru.wikipedia.org/wiki/Модель_акторов). Параллельное программирование пока ещё не совершенно и не имеет достаточно юз кейсов. Однако использовать это нужно для разделения количества работы на потоке и уменьшения затраченного времени процессора. Больше мне особо нечего сказать.
Можете поделиться своей информацией, если, конечно, она правдива.
Начинаем с теории. Синхронное программирование - это программирование, при котором все действия идут после друг друга, то есть вызвалась одна функция, поток ждёт пока эта функция закончит своё выполнение и вернёт какое-либо значение. В асинхронном программировании такая концепция нарушается и эта одна функция может вызваться в одно время, но начнёт своё выполнение в совсем другое время, но при этом не остановит поток. Сам же поток начнёт выполнение этой функции тогда, когда будет в режиме сна.
При параллельном программировании эта функция вызывается одновременно с другой функцией, но на совсем другом потоке и, чаще всего, другой виртуальной машине, благодаря чему можно задействовать несколько ядер системы.
Синхронное программирование, хоть и является достаточно безопасным, не имеет плюсов в производительности, а даже наоборот - только ухудшает её.
В роблоксе очень распространено асинхронное программирование, оно является средним уровнем между безопасностью и производительностью.
Бездумное использование асинхронного программирования может привести к массивной утечке памяти. Но об этом я расскажу позже. Сейчас же я расскажу как оно работает в роблоксе и луау.
В роблоксе нам дают целых две библиотеки для работы с асинхронностью. Это coroutine и task. Также есть и тип данных, обозначающий функцию, которая выполняется асинхронно - называется он, иронично, потоком. Кратко пробегусь по этим двум библиотекам.
Coroutine является более быстрой, т.к. взаимодействует только с Lua и C++. Имеет она всего три распространённых в использовании функции: create, resume и wrap. По названиям понятно, что create создаёт новый поток и возвращает его, но не запускает его, resume уже как раз таки его запускает. Wrap же создаёт поток и возвращает функцию, которая запускает этот самый поток.
Таск имеет четыре распространённых в использовании функции, это spawn, wait, defer и cancel. Спавн создаёт поток, запускает его и возвращает его, вейт останавливает поток на определённое кол-во секунд, однако он привязан к ивенту ран сервиса, так что он будет ожидать не идеальное кол-во времени. Дефер, это тоже самое, что и спавн, только происходит на конце текущего кадра. cancel, логично, отклоняет работу какого-либо потока.
Каждый поток весит немалое количество памяти, а также они не очищаются коллектором мусора пока они не перестанут работать (status == "dead"). То есть, вы должны предотвращать создание большого количества потоков и в принципе предотвращать использование функций, которые надолго останавливают код.
На практике такое программирование используется в более эффективных кастомных сигналах, а также там, где результат возвращения функции не важен.
Параллельное программирование в роблоксе основано на системе акторов (https://ru.wikipedia.org/wiki/Модель_акторов). Параллельное программирование пока ещё не совершенно и не имеет достаточно юз кейсов. Однако использовать это нужно для разделения количества работы на потоке и уменьшения затраченного времени процессора. Больше мне особо нечего сказать.
Можете поделиться своей информацией, если, конечно, она правдива.