LINUX.ORG.RU

LuaJit coroutines/сопрограммы - вопросик по адекватности происходящего

 , , ,


0

2

Имеем такой незамысловатый код

function gg(name)
   while(true) do 
      coroutine.yield(name)
      io.write(name.."\n")
   end
end

c1 = coroutine.create(gg)
c2 = coroutine.create(gg)

while true do
    coroutine.resume(c1,"alisa")
    coroutine.resume(c2,"bob")
end

Суть вот в чём.
Если запустить lua5.x test.lua (x=1,2,3,4) и послать сигнал kill -s SIGINT $(pidof lua) То ожидаемо вижу

...
alisa
bob
alisa
bob
lua: test.lua:24: interrupted!
stack traceback:
	[C]: in function 'resume'
	test.lua:24: in main chunk
	[C]: in ?
dron@gnu:~/Рабочий-стол$ 

А если запустить luajit test.lua и послать сигнал kill -s SIGINT $(pidof luajit) То завершается лишь одна сопрограмма, а вторая продолжает работать, а какая из них уже зависит от того какая была активна в момент принятия программой сигнала.
Я ещё исходники не копал, ну так по диагонали глянул, так и должно быть? Или это «фича» luajit ?

сисьиньфо

dron@gnu:~/Рабочий-стол/nsec.lua$ luajit -v
LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2022 Mike Pall. https://luajit.org/
############################################################################
dron@gnu:~/Рабочий-стол/nsec.lua$ lua -v
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
dron@gnu:~/Рабочий-стол/nsec.lua$ lua5.1 -v
Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
dron@gnu:~/Рабочий-стол/nsec.lua$ lua5.2 -v
Lua 5.2.4  Copyright (C) 1994-2015 Lua.org, PUC-Rio
dron@gnu:~/Рабочий-стол/nsec.lua$ lua5.3 -v
Lua 5.3.6  Copyright (C) 1994-2020 Lua.org, PUC-Rio
dron@gnu:~/Рабочий-стол/nsec.lua$ lua5.4 -v
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
dron@gnu:~/Рабочий-стол/nsec.lua$ uname -a
Linux gnu 6.0.0-6-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.0.12-1 (2022-12-09) x86_64 GNU/Linux
dron@gnu:~/Рабочий-стол/nsec.lua$

Я понимаю что luajit отношения к ванильной луа не имеет и всё такое, мне интересно именно поведение, это норм или нет. А то я тут послал вчера сигнал то и спать лёг, а утром проснулся, а оно всё молотит только молотит половина программы лол, я такой "во дела! Надо на ЛОР срочно написать, вот пишу :D

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)

Ответ на: комментарий от fluorite

Да, видимо оно. Для полноты картины надо пропатчить Coco’й lua5.1 и провести тест. Должно повторится всё как и в luajit потом. Но это потом. Спасибо большое.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от pathfinder

Кажется, нет. Просто SIGINT обрабатывается и приводит к Exception. Его можно обработать, но корутина этого не делает и умирает. Дальше разные реализации Lua отличаются по тому нужно ли при необработанном исключении в одной корутине грохать весь процесс или нет.

KivApple ★★★★★
()
Ответ на: комментарий от pathfinder

Не будем же считать, что ловля SIGINT в языке Lua - это UB.

Lua может работать там где понятие сигналов просто не существует. Это зависит от программы хоста которая ловит сигнал и посылает hook в lua машину. Сама по себе Lua ни про какие сигналы понятия не имеет, как и любой язык.

Т.е. в LuaJit кривая реализация.

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

Опять же если ты пишешь под luajit то ты забываешь про существование любой другой lua в принципе. Подразумевается что ты вшиваешь lua в свою программу и какую вшил с той ты на всегда ибо ты неизбежно начнёшь использовать специфичные штуки так как тебе плевать установлена ли lua на ОС в принципе, другие версии для тебя не сущетвуют и любые различия тоже, если же ты пишешь на луа как просто на луа то всегда можешь запустить на той версии для котрой у тебя твой скрипт, а если этой версии нету то это невозможно, если есть любая одна значит есть любая другая (ну в смысле установить/собрать можно). Так что обратная несовместимость хоть и плохо что есть, но она логична. Чво вшил то у тебя и есть. Даже байткод у всех lua разный и привязан к конкретной версии.

Понятие «совместимость» в lua это такое себе, полумифическое. Как бы вроде есть, только вот не для, а вопреки =) Ну насколько я понял, я только вливаюсь. Может чево путаю =)

А так хотелось бы преемственности конечно, но это если смотреть на Lua как самостоятельный язык, но это не так, lua всегда сама по себе «сопрограмма» для основной хост программы =) Хотя и хочется думать что это не так, а это так. Поэтому как самостоятельный язык так себе ибо чехарда с версиями, там ещё и ABI ваще на любом миноре ломается, биндинги к либам от 5.1 не пашут на 5.3 :D Жесть

https://cs12.pikabu.ru/images/big_size_comm/2022-06_3/1655185086149525468.jpg

На самом деле у меня уже от этого всего неделю пукан горит… Простите =)

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 7)
Ответ на: комментарий от LINUX-ORG-RU

Сама по себе Lua ни про какие сигналы понятия не имеет, как и любой язык.

Спорное утверждение, например, perl вполне себе имеет понятие и про исгналы, и про множество других UNIX-концепций. Правильнее было бы использовать формулировку «любой язык, ставящий своей целью независимость от платформы»

annulen ★★★★★
()