[Toribio] wait or sigrun esperar por tarea

[Toribio] wait or sigrun esperar por tarea

de Nicolas Federico Furquez Morena -
Número de respuestas: 7

Hola, quisiera saber si existe la posibilidad de esperar eventos de una/s tarea/s particular dentro de Toribio, segun lumen es posible, pero en los ejemplos:

sched.sigrun({emitter={emitter2, emitter3}, events={'evB', 'evC'}}, print)

emitter2, emitter3, fueron definidas antes en el mismo archivo.
Ahora en Toribio potencialmente uno puede definir emisores en distintos archivos (tasks), como se podria acceder a esas tareas y ponerlo en el parametro emitter?
Para los device se puede esperar por ellos y luego ponerlo en el parametro emitter.
En los ejemplos solo aparece la posibilidad de esperar eventos de cualquier emisor con emmiter='*' y me gustaria limitar esto.

saludos y gracias
Nicolás
En respuesta a Nicolas Federico Furquez Morena

Re: [Toribio] wait or sigrun esperar por tarea

de Jorge Visca -

Eso lo resolves usando un catalogo. Algunos ejemplos de Lumen lo usan, por ejemplo tests/test.lua

Un catalogo permite almacentar objetos bajo un nombre, y luego recuperarlos (bloqueando a la espera de que aprezcan, como sucede con los devices).

Primero tenes que obtener un catalogo. Si vas a guardas tareas, podes ponerele de nombre "tasks". En todas las tasks que necesiten acceder a este catalogo, simpemente incluiran la siguiente linea:

local tasks = require 'catalog'.get_catalog('tasks')

Despues una tarea puede registrarse a si misma en el catalogo:

tasks:register('first task', sched.running_task)

(Tambien se puede registar cualquier otra tarea, poniendola como segundo parametro)

Desde otro archivo, en otra tarea, se puede encontrarla a la primera haciendo:

local taskd = tasks:waitfor('first task')
sched.sigrun({emitter=taskd, events= ...

Si cuando se ejecuta el waitfor la primer tarea todavia no tuvo oportunidad de registrarse, el waitfor quedara a la espera de que esto suceda para poder seguir.

 

Saludos,

Jorge

 

 

 

 

 

 

 

 

 

En respuesta a Jorge Visca

Re: [Toribio] wait or sigrun esperar por tarea

de Nicolas Federico Furquez Morena -

otra consulta, por medio del catalogo y obteniendo la tarea como dijiste:

local taskd = tasks:waitfor('first task')

yo podría acceder a funciones o cualquier propiedad que yo defina en 'first task' ? obviamente sabiendo como se llama, por ejemplo:

taskd.function() o taskd.valor = xxx

 

mucahs gracias

Nicolás

En respuesta a Nicolas Federico Furquez Morena

Re: [Toribio] wait or sigrun esperar por tarea

de Jorge Visca -

Lo que recuperas del catalogo es exactamente lo que guardaste, podes usarlo como quieras. 

Si lo que queres hacer es pasar datos entre tareas, podes adjuntarlos al taskd (que me parece es lo que intentas hacer), o crearte un catalogo aparte para tus datos. Lo único que hay que definir es cómo se llama el catálogo, y con que nombre vas a guardas las entradas ahi. 

La ventaja de hacerlo asi es que el que consume puede quedar esperando a que un dato en particular se publique, que puede no estar disponible enseguida (la tarea puede tardar en crearlo o lo que sea).

Un detalle, el nombre de un objeto en el catálogo no tiene por que ser un string, aunque esto es lo más usual. Puede ser cualquier cosa. Por ejemplo, si un task abre un archivo y quiere publicar el file descriptor puede crear un catalogo "files", y usarse a si mismo como clave:

 

local files require 'catalog'.get_catalog('files')
tasks:register(sched.running_task, fd)

Cualquiera que conozca al task ese (por ejemplo porque lo sacó del catalogo "tasks") puede hacer :

local files require 'catalog'.get_catalog('files')
local fd = files:waitfor(taskd)

 

En respuesta a Jorge Visca

Re: [Toribio] wait or sigrun esperar por tarea

de Nicolas Federico Furquez Morena -

Jorge, como andas? estoy teniendo unos problemas con lo que te pregunte en el mensaje anterior. Tengo todo mas o menos armado con en el adjunto la diferencia es que tengo varias tareas y selecciono cual elijo correr funcionA().

Probé declarar funcionA dentro de M.init y dentro de sched.run() dentro de dos.lua y me tira el siguiente error:

 
 

Tue Jun 11 00:45:15 2013 SCHED-WARNING: task: #8 die on error, returning 1 parameters: ./tasks/arbitro.lua:75: attempt to call field funcionA' (a nil value)
Tue Jun 11 00:45:15 2013 SCHED-WARNING: task: #6 die on error, returning 1 parameters: ./tasks/comp1.lua:17: attempt to call global 'rint' (a nil value)

al hacer taskd.funcionA()  en uno.lua
 
 
Probé llamarlo como metodo (taskd:funcionA()) pero me da el mismo problema. 
Y creo que probe poner la linea
 
tasks:register('tarea1', sched.running_task)
 
en dos.lua en varios lugares
en que le puedo estar errando?
 
muchas gracias 
Nicolás
En respuesta a Nicolas Federico Furquez Morena

Re: [Toribio] wait or sigrun esperar por tarea

de Jorge Visca -

En dos.lua declaras a funcionA como local, pero despues no la referencias en taskd. Adentro de init(), al principio, tenes que agregar: 

sched.running_task.funcionA=funcionA

A partir de entonces en la tabla de la tarea va a estar la funcion, que vas a poder acceder desde uno.lua como

taskd.funcionA()
El otro metodo que te mencionaba, con un catalgo separado para las funciones, quedaría así:

En uno.lua

...
local funcs require 'catalog'.get_catalog('funcs')
local func = tasks:waitfor('funcion1')
sched.run(function()
while true do
  -- hago algo
  func()
end
...

En dos.lua

...
local funcs require 'catalog'.get_catalog('funcs')
local function funcionA()
  -- cosas
end
M.init = function(conf)
  funcs:register('funcion1', funcionA)
...
En respuesta a Jorge Visca

Re: [Toribio] wait or sigrun esperar por tarea

de Nicolas Federico Furquez Morena -

Aaa bien ahora entendi, pense que en sched.running_task se tenia una referencia a dos.lua con todo lo que ahi hay. Ahora si yo uso el segundo metodo, cuando en uno.lua corro funcionA podria acceder a campos o funciones declaradas en dos.lua? por ejemplo

En dos.lua

...

local funcs require 'catalog'.get_catalog('funcs')

local motor = toribio.wait_for_device(conf.motorname)
local campo = 123
local function funcionA()
-- cosas
motor_left.set_speed(left)
print (campo)
end

M.init = function(conf)
motor = toribio.wait_for_device(conf.motorname)
funcs:register('funcion1', funcionA)
campo = 234
...

funcionA podria correr sin problemas si lo llamo desde uno.lua?

 

muchas gracias

Nicolás