Advertisement
_AMD_

Вырезка с чата на тему coroutines в Lua

Aug 12th, 2019
768
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.11 KB | None | 0 0
  1. Вырезка о корутинах для https://blog.amd-nick.me/lua-coroutines
  2.  
  3.  
  4. _AMD_, [05.08.19 22:40]
  5. @IVogel ты как-то говорил о курутинах и примере с выполнением кода на игрок/тик вместо все/тик.
  6.  
  7. Можешь скинуть образец такого кода, где каждый тик по очереди кому-то из игроков делает :ChatPrint ?
  8.  
  9. Vogel, [05.08.19 22:42]
  10. Нет образца.
  11. Создай короутину с циклом.
  12. В конце цикла в короутине делай coroutine.yield()
  13. Потом в Think/tick делай coroutine.resume(короутина)
  14.  
  15. _AMD_, [05.08.19 22:43]
  16. я никогда не работал с корутинами и не знаю, где они могут потребоваться. Ты наводил пример, но я не могу его найти. Я бы хотел посмотреть реализацию в коде
  17.  
  18. Mudkip, [05.08.19 22:43]
  19. https://wiki.garrysmod.com/page/coroutine/create тут пример есть вроде
  20.  
  21. Vogel, [05.08.19 22:47]
  22. Реальный пример использования.
  23. https://github.com/MightyPirates/OpenComputers/blob/b493512efdec7ab3e1676984c7e54aa301f25020/src/main/resources/assets/opencomputers/lua/machine.lua
  24.  
  25. Vogel, [05.08.19 22:59]
  26. [ Фото компьютера в Minecraft ]
  27. Видишь вот эту херобору?
  28.  
  29. Vogel, [05.08.19 22:59]
  30. Так вот, каждый такой вот комплюхтер (если можно выразиться так) исполняется в одном потоке. В одном окружении. Каждый имеет свою собственную короутину.
  31.  
  32. _AMD_, [05.08.19 23:00]
  33. по идее это предотвращает потенциальные лаги при огромном кол-ве компов на сервере?
  34.  
  35. Vogel, [05.08.19 23:00]
  36. И если бы небыло короутины и кто-то бы сделал while true do end - всё бы зависло.
  37.  
  38. _AMD_, [05.08.19 23:01]
  39. так корутина это типа штука, которая ждет окончания процесса (функции) и после этого запускает следующий?
  40.  
  41. Vogel, [05.08.19 23:01]
  42. [In reply to _AMD_]
  43. +- да.
  44.  
  45. _AMD_, [05.08.19 23:05]
  46. я все равно не понимаю, как именно корутина технически избавляет сервер от фриза при обработке многих задач
  47.  
  48. _AMD_, [05.08.19 23:05]
  49. типа она расталкивает их на столько тиков, сколько требуется для "безлажного" выполнения?
  50.  
  51. Vogel, [05.08.19 23:06]
  52. Типа того, я не могу лучше объяснитб.
  53.  
  54. Vogel, [05.08.19 23:06]
  55. Это всёравно, что если ты будешь в Think хуке исполнять кусочки кода по отдельности.
  56.  
  57. _AMD_, [05.08.19 23:11]
  58. тоесть, оно словно построчно функцию выполняет?
  59.  
  60. _AMD_, [05.08.19 23:14]
  61. yield это как разделитель функции? Указывает, где ей нужно сделать "чекпоинт" и вернуть часть результата?
  62.  
  63. Vogel, [05.08.19 23:14]
  64. +
  65.  
  66. _AMD_, [05.08.19 23:14]
  67. может быть несколько yield в задаче?
  68.  
  69. Vogel, [05.08.19 23:15]
  70. Да, в разных местах.
  71.  
  72. _AMD_, [05.08.19 23:16]
  73. [ Фото ответа с сайта ]
  74. Вот нашел (https://ru.stackoverflow.com/questions/620057) довольно неплохой пример, который дал мне понять половину того, что я изучил о корутинах за все время :)
  75.  
  76. _AMD_, [05.08.19 23:20]
  77. yield передает "эстафету" следующей задаче?
  78.  
  79. _AMD_, [05.08.19 23:21]
  80. задачи в корутине вообще как, в цикле находятся или одна корутина — одна задача вовсе?
  81.  
  82. Vogel, [05.08.19 23:21]
  83. Одна короутина - одна задача.
  84. Но в короутине можно делать циклы.
  85.  
  86. _AMD_, [05.08.19 23:22]
  87. и итерации цикла разделять через yield?
  88.  
  89. Vogel, [05.08.19 23:22]
  90. +
  91.  
  92. Vogel, [05.08.19 23:22]
  93. А еще у тебя появляется доступ к такому изуверству как sleep
  94.  
  95. _AMD_, [05.08.19 23:37]
  96. В ответ на предыдущее сообщение со скриншотом]
  97. [ Photo ]
  98. Еще один (https://ilovelua.wordpress.com/2012/02/02/) вариант с моего любимого сайта по Lua. Наглядно видно, как корутина обрабатывает задачки внутри
  99.  
  100. Простыми словами, она позволяет функциям "останавливаться" на местах использования yield внутри. Таким образом мы можем "размазывать" выполнение функции на несколько раз
  101.  
  102. Например, создали корутину, в ней 2 yield и в конце return (типа окончательный yield. Считаем, что 3 остановки). Это значит, что задача внутри корутины выполнится за 3 resume
  103.  
  104. Область применения конкретно в гмоде для меня туманна. Как вариант — делать http.Fetch и подобные через корутины для красоты кода, когда важна поочередная обработка
  105.  
  106. Если рассматривать, как штуку для оптимизации — применений в упор не вижу. Разве что датчики на HUD по очереди обновлять, но это нужно только если калькуляции тяжелые, а не простейшие :Health() :Armor()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement