Lua debug hooks, кажется, мешает работе сопрограммы - PullRequest
0 голосов
/ 25 февраля 2019

Итак, я пытаюсь построить многозадачную систему в lua, которая через определенные промежутки времени передает управление основному потоку.Проблема состоит в том, что debug.sethook, кажется, заставляет сопрограммы немедленно умирать, когда вы устанавливаете его для вызова coroutine.yield.

Настройка, чтобы сделать что-то еще, кажется, работает должным образом.

o=coroutine.create(function()
   print("Hello")
   print("goodbye")
end)
debug.sethook(o,coroutine.yield,"l",1)
coroutine.resume(o)--No output here
print(coroutine.status(o))--prints dead.

Что я делаю не так?

Редактировать: Это также происходит в почти минимальном контексте, поэтому я упростил пример кода.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

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

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

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

0 голосов
/ 26 февраля 2019

Если вы напечатаете результат вызова resume, вы увидите что-то вроде false attempt to yield across a C-call boundary, поэтому выполнение завершится неудачно, так как вы пытаетесь yield из ловушки отладки, что вы не можете сделать (вынужно будет вернуться с отладочного крючка).Вы можете resume из ловушки отладки в другую сопрограмму и уступить оттуда, но вы не можете уступить из ловушки.

Может быть, вам может быть рекомендовано другое решение, если вы объясните, что вы пытаетесь сделать(в редакции).

...