Многопоточность в Lua

У меня было обсуждение с моим другом на днях. Я говорил, как это, в чистом Lua, Вы не могли создать систему вытесняющей многозадачности. Он утверждает, что Вы можете из-за следующей причины:

И C и Lua не имеют никаких встроенных библиотек поточной обработки [примечание OP: хорошо, Lua технически делает, но AFAIK это не полезно для наших целей]. Windows, который записан в главным образом C (++), имеет вытесняющую многозадачность, которую они создали с нуля. Поэтому необходимо смочь сделать то же в Lua. Большая проблема, которую я вижу с этим, состоит в том, что основной способ, которым работает вытесняющая многозадачность (к моему знанию) состоит в том, что это генерирует регулярные прерывания, которые использование менеджера получить контроль и определить, что кодирует его, должно продолжать работать затем. Я также не думаю, что Lua имеет любое средство, которое может сделать это.

Мой вопрос: действительно ли возможно записать чистую-Lua библиотеку, которая позволяет людям иметь вытесняющую многозадачность?

9
задан M. Tibbits 10 August 2011 в 04:36
поделиться

2 ответа

Я не понимаю, как это сделать, хотя без формальной семантики Lua (например, семантики yield ) действительно сложно придумать железный аргумент, почему это невозможно. (Мне нужна была формальная семантика лет , но, очевидно, у Роберто и lhf есть дела поважнее.)

Если бы я хотел превентивную многозадачность для Lua, я бы даже не пытался сделайте это на чистом Lua.Вместо этого я бы использовал старый трюк, который впервые увидел 20 лет назад в Standard ML в Нью-Джерси:

  • Interrupt устанавливает флаг в lua_State , говорящий, что «текущая сопрограмма была вытеснена».

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

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

9
ответ дан 4 December 2019 в 11:03
поделиться

Не знаю, нет. Было бы почти абсурдно просто, если бы вы могли уступить из хуков, установленных в сопрограммах, с помощью debug.sethook, но это не работает. Вы можете получить результат из C-хуков, установленных из C (lua_sethook), но я не мог вычислить точно , чтобы сделать это, и в любом случае это не чистый Lua.

Даже если бы это было возможно, это не была бы настоящая многопоточность. Например, все будет по-прежнему работать в одном потоке операционной системы. Ваш крючок будет учитывать множество факторов (например, время, возможно, память и т. Д.), А затем определять, уступать ли. Подчиненная сопрограмма затем решит, какую дочернюю сопрограмму запустить следующей. Вам также нужно будет решить, когда следует вызывать ловушку. Чаще всего встречается в каждой инструкции Lua, но это снижает производительность. И если сопрограмма вызывает функцию C, Lua не имеет юрисдикции. Если этот вызов C занимает много времени, вы ничего не можете с этим поделать.

Здесь - связанная ветка из списка рассылки Lua-L, которая может вас заинтересовать.

5
ответ дан 4 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

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