
Anterior: Como instalar o ALua 6.0 |
Próximo: A API para canais TCP |
Esta função cria um novo daemon, mas não conecta o processo ao mesmo.
Esta função recebe como primeiro argumento (config) uma tabela de configuração que pode conter os seguintes campos:
Chave |
Valor |
Tipo |
| addr | Endereço IPv4 no qual o novo daemon deverá escutar. |
string |
| port | Porta na qual o novo daemon deverá escutar. | número |
Esta função operará de maneira assíncrona, assim, callback recebe como parâmetro uma tabela contendo informações sobre o resultado da operação, da seguinte forma:
Chave |
Valor |
Tipo |
| status | - "ok": caso daemon tenha sido criado com sucesso. - "error": caso contrário. |
string |
| error | Em caso de erro, este campo possui uma mensagem descritiva. | string |
| daemon | Em caso de sucesso, este campo contém o identificador do daemon no qual o processo se conectou. | string |
Esta função também configura o valor dos campos alua.id e alua.daemonid.
Para criar um daemon na porta 4821 de uma máquina com IP 192.168.21.67, usamos o seguinte código:
function cb(reply)
if reply.status == "ok" then
print(reply.daemon)
print(alua.id)
print(alua.daemonid)
else
print(reply.error)
end
end
alua.create( {addr = "192.168.21.67", port = 4821}, cb)
Este campo contém o identificador do daemon ao qual o processo está conectado. Caso o processo não esteja conectado, este campo contém nil.
Finaliza o processo atual ou processo(s) remoto(s).
Esta função pode ser usada de duas formas. Quando invocada sem parâmetros ou com um código inteiro (code) de finalização, esta função termina o processo que a invocou. O código de finalização é passado para a função os.exit().
Ex: alua.exit() ; alua.exit(1)
A segunda forma permite finalizar processos remotamente. procs pode ser um identificador de processo ou um array de identificadores. for o valor nil, o processo chamador é finalizado. Opcionalmente, pode ser informado um inteiro (code) que será usado como código de finalização. Caso seja fornecida, callback é uma função que é executada para obter o retorno da operação remota.
Não se tratando da terminação do processo chamador, esta função operará de maneira assíncrona, portanto no momento de envio da solicitação ao daemon nenhum valor será retornado. Quando a resposta for recebida, a função callback é chamada e terá como argumento uma tabela de resposta. Esta tabela tem como chaves os identificadores de cada processo cuja terminação foi solicitada, e o valor de cada chave é uma tabela contendo os campos descritos a seguir:
Chave |
Valor |
Tipo |
| status | - "ok": caso o processo tenha recebido a requisição. - "error": caso contrário. |
string |
| error | Em caso de erro, este campo contém uma mensagem descritiva. | string |
Este primeiro exemplo cria um grupo de processos e em seguida os finaliza.
require("alua")
function exitcb(reply)
for proc, termination in pairs(reply) do
if termination.status == "ok" then
print("Process " .. proc .. " terminated")
end
end
-- Finaliza o daemon
alua.exit(alua.daemonid, 0)
-- Finaliza a própria execução
alua.exit()
end
function spawncb(reply)
-- Cria a lista de novos processos
local procs = { }
for proc in pairs(reply.processes) do
table.insert(procs, proc)
end
-- Finaliza os novos processos
alua.exit(procs, 0, exitcb)
end
function opencb(reply)
-- Cria um conjunto de novos processos
alua.spawn(4, spawncb)
end
alua.open({addr = "127.0.0.1", port = 6080}, opencb)
alua.loop()
Este campo contém o identificador do processo atual, quando este está conectado a um daemon. Caso o processo não esteja conectado, este campo contém nil.
Faz o daemon do processo atual se conectar a outros daemons.
Esta função recebe como argumento um array de identificadores de daemons a serem contactados (argumento daemons) ao daemon do processo requisitante, e tem como intuito montar a rede de daemons a serem utilizados pela aplicação. Em geral, a rede é montada na inicialização da aplicação. Processos em daemons diferentes só podem trocar mensagens se os seus daemons estiverem ligados.
Esta função opera de maneira assíncrona, portanto no momento de envio da solicitação ao daemon nenhum valor é retornado. Quando a resposta for recebida, a função callback é chamada e terá como argumento uma tabela de resposta, a qual poderá conter os seguintes campos:
Chave |
Valor |
Tipo |
| status | - "ok": caso a ligação tenha sido realizada com sucesso. - "error": em caso de erro. |
string |
| error | Mensagem descritiva em caso de erro. | string |
| daemons | Em caso de sucesso, um array contendo o identificador dos daemons ligados. | tabela |
O código abaixo cria um daemon na porta 6080 e em seguinda cria e se conecta com um segundo daemon na porta 8061. Em seguida o processo realiza a ligação entre esses dois daemons. A função de callback apenas exibe o resultado da chamada de alua.link().
require("alua")
function linkcb(reply)
for k, v in pairs(reply) do
print(k, v)
end
print("---")
for k, v in ipairs(reply.daemons) do
print(k, v)
end
end
function opencb(reply)
alua.link({ "127.0.0.1:6080", "127.0.0.1:6081" }, linkcb)
end
alua.create({ addr = "127.0.0.1", port = 6080 })
alua.open({ addr = "127.0.0.1", port = 6081 }, opencb)
alua.loop()
Executa o loop de eventos do ALua.
Esta função é responsável por verificar e disparar os eventos dos canais, tarefas e timers. Em geral, um programa ALua inicia sua execução com uma requisição de conexão a um daemon através de alua.open, e então invoca alua.loop para o tratamentos dos eventos subseqüentes.
Conecta o processo em um daemon. Esta função pode opcionalmente criar o daemon.
Esta função recebe como argumento o identificador de um daemon a ser contactado, ou, caso se queira criar um novo, uma tabela de configuração do novo daemon. O identificador de um daemon é uma string formada pelo endereço IPv4 da interface de rede, concatenado com ":" e então a porta de conexão.
A função alua.open também pode ser usada para criar um novo daemon e realizar a conexão com o mesmo. Neste caso, basta fornecer uma tabela de configuração em vez do identificador do daemon. Essa tabela de configuração é idêntica à descrita na função alua.create.
Esta função opera de maneira assíncrona, portanto no momento de envio da solicitação, valor é retornado. Quando a resposta for recebida, a função callback é chamada e terá como argumento uma tabela de resposta, a qual poderá conter os seguintes campos:
Chave |
Valor |
Tipo |
| status | - "ok": caso o processo tenha se conectado com sucesso. - "error": em caso de erro. |
string |
| error | Mensagem descritiva em caso de erro. | string |
Considere um daemon na porta 4821 de uma máquina com IP 192.168.21.67. O identificador do mesmo é, portanto, a string "192.168.21.67:4821", e para contactá-lo pode-se usar a seguinte chamada:
function opencb(reply)
for k, v in pairs(reply) do
print(k, v)
end
end
alua.open("192.168.21.67:4821", opencb)
alua.loop()
Como um segundo exemplo, considere o código a seguir que cria um daemon na porta 5963 e IP "127.0.0.1" e em seguida se conecta com o mesmo.
function opencb(reply)
for k, v in pairs(reply) do
print(k, v)
end
end
alua.open({ addr = "127.0.0.1", port = 5963}, opencb)
alua.loop()
Envia uma mensagem para um ou mais processos.
Esta função recebe destination como argumento, que pode ser o identificador de um processo ou um array de indetificadores, e envia a mensagem message a cada processo. Opcinalmente, a função callback pode ser informada para receber o resultado da requisição.
Esta função opera de maneira assíncrona, portanto no momento de envio da solicitação, nenhum valor é retornado. Quando a resposta for recebida e a função callback é chamada, tendo como argumento uma tabela de resposta. Esta tabela tem como chave o identificador de cada processo destinatário, e como valor uma tabela descrevendo o resultado, da seguinte forma:
Chave |
Valor |
Tipo |
| status | - "ok": caso o processo tenha recebido e processado a mensagem com sucesso. |
string |
| error | Mensagem descritiva em caso de erro. | string |
O exemplo a seguir cria 12 processos e então envia uma mensagem para dada um deles.
require("alua")
function sendcb(reply)
for id, msg in pairs(reply) do
if msg.status == "ok" then
print("Message received and executed by " .. id)
else
print("Process " .. id .. " could not receive or execute the message")
print("Error: " .. msg.error)
end
end
end
function spawncb(reply)
for proc, resp in pairs(reply.processes) do
if resp.status == "ok" then
alua.send(proc, [[ print("Hello World!") ]], sendcb)
end
end
end
function opencb(reply)
alua.spawn(12, spawncb)
end
alua.open({addr = "127.0.0.1", port = 6080}, opencb)
alua.loop()
Inicia novos processos.
Esta função recebe como primeiro argumento um parâmetro especificando quantos processos devem ser criados, e, opcionalmente, uma função callback. O parâmetro param pode especificar: (i) a quantidade de processos a serem cridados; (ii) um array com os nomes dos novos processos; ou (iii) a forma como cada daemon deve criar os processos.
Se param for um número, a criação dos novos processos é distribuída entre os daemons participantes da aplicação, sempre tentando garantir o maior grau de simetria possível. Por exemplo, em uma aplicação com 4 daemons, a solicitação de 8 novos processos implica em cada daemon dando origem a 2 novos processos. Os novos processos são nomeados de acordo com seus respectivos daemons. Um processo criado em um daemon cujo identificador é "207.154.84.14:5921" terá como identificador uma string formada de um número que identifique unicamente o processo no daemon e pelo identificador do daemon. Por exemplo, processos criados no daemon "207.154.84.14:5921" podem ter como identificadores as strings "1@207.154.84.14:5921", "2@207.154.84.14:5921", "3@207.154.84.14:5921" e assim sucessivamente.
No caso de param ser um array, o mesmo deve conter os nomes dos processos a serem criados. Estes podem ser nomes arbitrários e serão os identificadores dos novos processos, e devem ser únicos de cada processo no universo da aplicação. Esses processos também serão distribuídos entre os daemons da aplicação.
Também é possível especificar como um cada determinado daemon criará os novos processos. Neste caso, a variável param deve ser uma tabela onde cada chave é o identificador de um daemon, e o valor pode ser um número ou um array de nomes. A chamada alua.spawn enviará para cada daemon a requisição apropriada, ou seja, criação de novos processos pela quantidade ou pelos nomes fornecidos.
Esta função opera de maneira assíncrona, portanto no momento de envio da solicitação ao daemon nenhum valor é retornado. Quando a resposta for recebida, a função callback é chamada, tendo como argumento uma tabela de resposta que segue o modelo descrito a seguir.
Chave |
Valor |
Tipo |
| status | - "ok": caso a requisição de criação tenha sido entregue a todos os daemons. - "error": em caso de erro. |
string |
| error | Mensagem descrevendo o erro ocorrido. | string |
| processes | Em caso de sucesso, esta tabela informações sobre os processos criados. | tabela |
A tabela processes descrita acima, por sua vez, tem como chave os identificadores dos processos criados e como valor para cada chave, uma tabela contendo informações sobre o mesmo, descrita a seguir:
Chave |
Valor |
Tipo |
| status | - "ok": caso o processo tenha sido criado com sucesso. - "error": em caso de erro. |
string |
| error | Mensagem descrevendo o erro ocorrido. | string |
| daemon | Em caso de sucesso, identificador do daemon onde o processo foi criado. | string |
O exemplo abaixo ilustra um uso típico da função alua.spawn.
require("alua")
function spawncb(reply)
for id, proc in pairs(reply.processes) do
if proc.status == "ok" then
print(id .. " successfully spawned on " .. proc.daemon)
else
print("Failed to spawn " .. id .. ": " .. proc.error)
end
end
end
function opencb(reply)
alua.spawn(7, spawncb)
alua.spawn({ "A", "B", "C", "D"}, spawncb)
end
alua.open({addr = "127.0.0.1";, port = 6080}, opencb)
alua.loop()
Serializa o objeto para string.
Esta função fornece um mecanismo simples de serialização de valores Lua. Ela recebe como argumento um valor e retorna sua representação como string. No entanto, alua.tostring possui duas limitações: (i) não serializa funções, co-rotinas e userdata; (ii) não resolve referenças cruzadas em tabelas, ou seja, se duas chaves apontam para um mesmo valor, este será duplicado na serialização.
Esta função retorna uma string que representa o valor.
Cria uma nova tarefa a ser executada no loop de eventos do ALua.
alua.task.schedule registra a função func para ser executada uma vez dentro do loop de eventos. Após a execução, a função é removida do registro de tarefas. Qualquer valor fornecido além da função func é tido como seu argumento, e serão fornecidos no momento em que func for executada.
Cria um novo temporizador.
Esta função registra a execução da função func (temporizador) com uma freqüência freq. A unidade da freqüência é em segundos e tem uma precisão de milisegundos.
Retorna um identificador para o temporizador.
O exemplo a seguir cria dois temporizadores que exibem mensagens na tela.
require("alua")
function ping()
print("ping")
end
function pong()
print("pong")
end
t1 = alua.timer.create(2, ping)
t2 = alua.timer.create(3, pong)
alua.loop()
Cancela a execução de um temporizador.
Esta função remove o temporizador tp permanentemente do registro, fazendo com que o mesmo não seja mais disparado.
O exemplo a seguir cria dois temporizadores, um temporizador para exibir uma mensagem a cada um segundo, e outro para cancelar os temporizadores (incluindo si mesmo).
require("alua")
function hello()
print("Hello world!")
end
function stop()
alua.timer.cancel(t1)
alua.timer.cancel(t2)
end
t1 = alua.timer.create(1, hello)
t2 = alua.timer.create(10, stop)
alua.loop()
Cancela todos os temporizadores.
Esta função limpa o registro de temporizadores.
O exemplo a seguir cria dois temporizadores, um temporizador para exibir uma mensagem a cada um segundo, e outro para cancelar os temporizadores (incluindo si mesmo).
require("alua")
function hello()
print("Hello world!")
end
function stop()
alua.timer.flush()
end
t1 = alua.timer.create(1, hello)
t2 = alua.timer.create(10, stop)
alua.loop()
Última atualização: 20-Mai-2008 16:28