встраивание нескольких lua экземпляров в нескольких распараллелило программу

У меня есть программа с 4 потоками.

В каждом потоке я делаю luaL_newstate ();

Каждый поток только имеет доступ к своему собственному lua экземпляру.

Есть ли что-нибудь, о чем я должен волноваться? [Т.е. есть ли некоторое скрытое состояние, которое все lua экземпляры совместно используют за моей спиной?]

Спасибо!

15
задан anon 10 June 2010 в 20:54
поделиться

3 ответа

Нет, это должно работать нормально. Все состояния интерпретатора автономны в каждом экземпляре Lua. Я бы даже сказал, что это предпочтительный способ использования Lua с несколькими потоками и / или процессами.

Если вы обнаружите, что в конечном итоге вам все-таки нужно обмениваться данными между состояниями Lua, то лучше всего сериализовать данные и передать их с помощью C API. Я рекомендую прочитать технический документ « Изучение Lua для параллельного программирования ». Он представляет метод использования нескольких процессов Lua с передачей сообщений для межпроцессного взаимодействия .

20
ответ дан 1 December 2019 в 02:18
поделиться

Создание одного lua_State для каждого потока - хорошее решение для нескольких потоков выполнения Lua. Однако эти состояния очень разделены.В частности, трудно обеспечить безопасную связь между ними, поскольку Lua API является потокобезопасным только до тех пор, пока к каждому lua_State осуществляется доступ из одного потока за раз. (Ну, если lua_lock и lua_unlock не реализованы как подходящий мьютекс, чего нет в стандартных сборках ядра lua.)

Если этот уровень изоляции не установлен. приемлемо, то вам необходимо изучить один из нескольких механизмов, позволяющих экземплярам Lua хорошо взаимодействовать с другими в многопоточном процессе.

Мой любимый выбор - Lua Lanes , который обеспечивает несколько потоков вместе с механизмом для передачи сообщений и обмена значениями между ними в потокобезопасном режиме. Значения большинства типов Lua (включая userdata с небольшой поддержкой стороны C из библиотеки, которая их использует) могут безопасно и эффективно передаваться с одной дорожки на другую.

Существуют и другие механизмы, и хорошей отправной точкой для большинства из них является вики-страница пользователя Lua на сайте MultiTaksing .

6
ответ дан 1 December 2019 в 02:18
поделиться

Вы хороши, если вы не пытаетесь передать значения между экземплярами Lua без предварительного преобразования их в C. Например, будет практически невозможно совместно использовать изменяемую таблицу между экземплярами.

То, что вы спрашиваете, звучит легко, но не обязательно более полезно, чем просто запуск нескольких процессов, каждый со своим собственным Lua и собственным адресным пространством.

3
ответ дан 1 December 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: