Сопрограммы Lua - это не то же самое, что потоки в смысле операционной системы.
Потоки ОС являются приоритетными. Это означает, что они будут работать в произвольное время, крадя временные интервалы в соответствии с требованиями ОС. Они будут работать на разных процессорах, если они доступны. И они могут работать одновременно, где это возможно.
Lua сопрограммы не делают этого. Сопрограммы могут иметь тип «поток», но может быть только один активный сопрограмма одновременно. Сопрограмма будет работать до тех пор, пока сама сопрограмма не решит прекратить работу, введя команду coroutine.yield
. И как только он выдаст, он не запустится снова, пока другая подпрограмма не выдаст команду coroutine.resume
для этой конкретной сопрограммы.
сопрограммы Lua обеспечивают кооперативную многопоточность, поэтому они называются co подпрограммами. Они сотрудничают друг с другом. Одновременно выполняется только одна вещь, и вы переключаете задачи только тогда, когда задачи явно говорят об этом.
Вы можете подумать, что вы можете просто создать потоки ОС, создать некоторые сопрограммы в Lua, а затем просто возобновить каждый из них в отдельном потоке ОС. Это будет работать до тех пор, пока каждый поток ОС выполняет код в другом экземпляре Lua . Lua API является реентерабельным; вам разрешено заходить в него из разных потоков ОС, но только , если вы звоните из разных экземпляров Lua. Если вы попытаетесь использовать многопоточность через один и тот же экземпляр Lua, Lua, скорее всего, будет делать неприятные вещи.
Все существующие модули потоков Lua создают альтернативные экземпляры Lua для каждого потока. Lua-lltreads просто создает совершенно новый экземпляр Lua для каждого потока; не существует API для межпотокового взаимодействия за пределами копирования параметров, передаваемых в новый поток. LuaLanes предоставляет некоторый кросс-код.