Недавно я столкнулся с множеством трудностей, когда развивался с использованием C++ и Lua. Моя ситуация: по какой-то причине в моей программе на C++ могут быть тысячи Lua-состояний. Но эти состояния должны быть одинаковыми сразу после инициализации. Конечно, я могу выполнять luaL_loadlibs() и lua_loadfile() для каждого состояния, но это довольно тяжело (на самом деле для меня довольно долгое время даже для начального состояния). Итак, мне интересно следующую схему: что можно сделать с сохранением отдельного состояния Lua (единственного состояния, которое должно быть инициализировано), которое затем клонируется для других состояний Lua?Clone a lua state
ответ
К сожалению, нет.
Вы можете попробовать Плутон для сериализации всего состояния. Он работает очень хорошо, но в большинстве случаев он стоит примерно в то же время, что и при обычной инициализации.
Но Pluto - это просто сторонний инструмент, вы можете просто использовать его в сценарии lua. Что я хочу - клонировать lua-state в среде C++. – hbxfnzwpf
Почему это проблема, если функции доступны со стороны Lua? Предположительно, вы можете посмотреть на функции C, которые регистрируются, и просто вызвать то, что они называют, для сериализации состояния. Если вы не хотите, чтобы эти функции были доступны из Lua, не регистрируйте их для пользователя. В целом, это не похоже, что это было бы лучшим решением. –
Когда я начал с Lua, как вы однажды я написал программу с тысячами состояний, была такая же проблема и мысли, пока я не понял, что я делал это совершенно неправильно :)
Lua имеет сопрограмм и нити, вам нужно использовать эти функции, чтобы делать то, что вам нужно. Сначала они могут быть немного сложными, но вы должны понимать их через несколько дней, это будет стоить вашего времени.
Coroutine действительно хорошая особенность Lua, но то, что я ищу, - это способ клонирования состояния lua в моей программе на C++. Поскольку существуют тысячи сценариев lua (каждый может быть написан другим человеком) для меня, чтобы выполнить в моя программа на C++, приятно загружать их в несколько потоков. Поскольку каждое созданное состояние lua должно загружать один и тот же lib и загружать другой общий скрипт, прежде чем загружать его соответствующий скрипт, просто выполните lua_loadlib() и lua_load() для каждого состояния lua, которое возвращается lua_open(), для меня огромное бремя, поэтому я я блуждаю клон lua state напрямую. – hbxfnzwpf
Я думаю, что будет сложно выполнить именно то, что вы запрашиваете здесь, поскольку просто копирование состояния будет иметь внутренние ссылки, а также потенциальные указатели на внешние данные. Нужно было бы восстановить эти внутренние ссылки, чтобы не просто иметь несколько состояний, указывающих на источник клона.
Вы можете выполнить сериализацию состояния после запуска, а затем загрузить его в последующие состояния. Если инициализация действительно стоит дорого, это может стоить того.
Я думаю, что ближе всего делать то, что вы хотите, что было бы относительно легко было бы поставить государства в различных процессах путем инициализации одного состояния, а затем разветвление, однако операционная система поддерживает его: http://en.wikipedia.org/wiki/Fork_(operating_system)
Если вы хотите что-то доступное из Lua, вы можете попробовать что-то вроде этого: How do you construct a read-write pipe with lua?
Обратите внимание на следующий вызов API Lua Я думаю, что это именно то, что вам нужно.
lua_State *lua_newthread (lua_State *L);
Это создает новый поток, толкает его в стек, и возвращает указатель на lua_State
, который представляет этот новый поток. Новый поток, возвращаемый этой функцией, совместно с исходным потоком передает свою глобальную среду, но имеет независимый стек выполнения.
Не существует явной функции для закрытия или уничтожения потока. Потоки подлежат сборке мусора, как и любой объект Lua.
- 1. Что такое Lua State?
- 2. Java deep clone a object
- 3. Clone a Github repo
- 4. Persist a clone
- 5. Howto clone a URI
- 6. jquery clone function a a addClass inested
- 7. A * Pathfinding in Lua
- 8. Git pull/clone a branch
- 9. Linq2Sql Clone a Object C#
- 10. Clone (a.k.a. duplicate) a Запись
- 11. Appveyor clone a private repo
- 12. Clone a URI Eclipse 4.3
- 13. Clone a Gtk.Button from gjs
- 14. Clone a git repo для автономной машины
- 15. Clone a git repo на ящике Linux
- 16. clone a div in display none mode
- 17. deep clone a Список объектов в C#
- 18. Clone A Bare Repo Локально без ссылки
- 19. Clone a DataBound Checked List Box
- 20. Git clone a branch, а не master
- 21. Array in a Array in Lua
- 22. uniquely Id a function in lua
- 23. state state long state class names
- 24. Разница между $ a = & $ b, $ a = $ b и $ a = clone $ b в PHP OOP
- 25. IVR Call State State Machine
- 26. Использование revert to state before last git pull --rebase state
- 27. C++ State machine, влияющий на «HAS-A Parent»
- 28. Проверить несколько checkbox.checked state внутри a do while cycle
- 29. Clone a github repo в частном gitlab repo
- 30. Clone a <table> с конкретными строками и столбцами
Этот вопрос задает примерно тот же вопрос: http://stackoverflow.com/questions/1383768/cloning-lua-state –
Возможный дубликат [Состояние клонирования Lua] (http://stackoverflow.com/questions/1383768/ cloning-lua-state) – greatwolf