Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Вырезка о корутинах для https://blog.amd-nick.me/lua-coroutines
- _AMD_, [05.08.19 22:40]
- @IVogel ты как-то говорил о курутинах и примере с выполнением кода на игрок/тик вместо все/тик.
- Можешь скинуть образец такого кода, где каждый тик по очереди кому-то из игроков делает :ChatPrint ?
- Vogel, [05.08.19 22:42]
- Нет образца.
- Создай короутину с циклом.
- В конце цикла в короутине делай coroutine.yield()
- Потом в Think/tick делай coroutine.resume(короутина)
- _AMD_, [05.08.19 22:43]
- я никогда не работал с корутинами и не знаю, где они могут потребоваться. Ты наводил пример, но я не могу его найти. Я бы хотел посмотреть реализацию в коде
- Mudkip, [05.08.19 22:43]
- https://wiki.garrysmod.com/page/coroutine/create тут пример есть вроде
- Vogel, [05.08.19 22:47]
- Реальный пример использования.
- https://github.com/MightyPirates/OpenComputers/blob/b493512efdec7ab3e1676984c7e54aa301f25020/src/main/resources/assets/opencomputers/lua/machine.lua
- Vogel, [05.08.19 22:59]
- [ Фото компьютера в Minecraft ]
- Видишь вот эту херобору?
- Vogel, [05.08.19 22:59]
- Так вот, каждый такой вот комплюхтер (если можно выразиться так) исполняется в одном потоке. В одном окружении. Каждый имеет свою собственную короутину.
- _AMD_, [05.08.19 23:00]
- по идее это предотвращает потенциальные лаги при огромном кол-ве компов на сервере?
- Vogel, [05.08.19 23:00]
- И если бы небыло короутины и кто-то бы сделал while true do end - всё бы зависло.
- _AMD_, [05.08.19 23:01]
- так корутина это типа штука, которая ждет окончания процесса (функции) и после этого запускает следующий?
- Vogel, [05.08.19 23:01]
- [In reply to _AMD_]
- +- да.
- _AMD_, [05.08.19 23:05]
- я все равно не понимаю, как именно корутина технически избавляет сервер от фриза при обработке многих задач
- _AMD_, [05.08.19 23:05]
- типа она расталкивает их на столько тиков, сколько требуется для "безлажного" выполнения?
- Vogel, [05.08.19 23:06]
- Типа того, я не могу лучше объяснитб.
- Vogel, [05.08.19 23:06]
- Это всёравно, что если ты будешь в Think хуке исполнять кусочки кода по отдельности.
- _AMD_, [05.08.19 23:11]
- тоесть, оно словно построчно функцию выполняет?
- _AMD_, [05.08.19 23:14]
- yield это как разделитель функции? Указывает, где ей нужно сделать "чекпоинт" и вернуть часть результата?
- Vogel, [05.08.19 23:14]
- +
- _AMD_, [05.08.19 23:14]
- может быть несколько yield в задаче?
- Vogel, [05.08.19 23:15]
- Да, в разных местах.
- _AMD_, [05.08.19 23:16]
- [ Фото ответа с сайта ]
- Вот нашел (https://ru.stackoverflow.com/questions/620057) довольно неплохой пример, который дал мне понять половину того, что я изучил о корутинах за все время :)
- _AMD_, [05.08.19 23:20]
- yield передает "эстафету" следующей задаче?
- _AMD_, [05.08.19 23:21]
- задачи в корутине вообще как, в цикле находятся или одна корутина — одна задача вовсе?
- Vogel, [05.08.19 23:21]
- Одна короутина - одна задача.
- Но в короутине можно делать циклы.
- _AMD_, [05.08.19 23:22]
- и итерации цикла разделять через yield?
- Vogel, [05.08.19 23:22]
- +
- Vogel, [05.08.19 23:22]
- А еще у тебя появляется доступ к такому изуверству как sleep
- _AMD_, [05.08.19 23:37]
- В ответ на предыдущее сообщение со скриншотом]
- [ Photo ]
- Еще один (https://ilovelua.wordpress.com/2012/02/02/) вариант с моего любимого сайта по Lua. Наглядно видно, как корутина обрабатывает задачки внутри
- Простыми словами, она позволяет функциям "останавливаться" на местах использования yield внутри. Таким образом мы можем "размазывать" выполнение функции на несколько раз
- Например, создали корутину, в ней 2 yield и в конце return (типа окончательный yield. Считаем, что 3 остановки). Это значит, что задача внутри корутины выполнится за 3 resume
- Область применения конкретно в гмоде для меня туманна. Как вариант — делать http.Fetch и подобные через корутины для красоты кода, когда важна поочередная обработка
- Если рассматривать, как штуку для оптимизации — применений в упор не вижу. Разве что датчики на HUD по очереди обновлять, но это нужно только если калькуляции тяжелые, а не простейшие :Health() :Armor()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement