Um tópico é uma única unidade de execução em um programa. Um programa comum é um thread único, onde as instruções no programa são executadas sucessivamente até o término.
Por outro lado, a multi-threading permite que o programa crie vários tópicos onde as instruções em um programa podem executar. Oferece excelente utilização de recursos do sistema, como CPU e memória.
Em Ruby, usamos tópicos com a ajuda da aula de threads. Os tópicos em Ruby não são pesados, tornando-os eficientes para empregar simultaneidade em seus programas.
Os tópicos são implementados no intérprete Ruby para o rubi versão 1.9 e abaixo. A partir da versão 1.9 e acima, o encadeamento é implementado no sistema operacional.
Usando este guia, você aprenderá como implementar tópicos na programação rubi.
Ponto de nota: O intérprete de Matz (RM) tem um bloqueio global de intérprete que impede vários tópicos de executar simultaneamente. No entanto, isso não se aplica aos intérpretes de Jruby e Rubinius.
Criando um tópico
Como mencionado, podemos trabalhar com tópicos usando a classe Thread. Para criar um novo tópico, ligue para o tópico.novo método.
A sintaxe é:
Fio.Novo # thread Block vai aqui
Certifique -se de incluir o código que você deseja ter executado pelo tópico dentro do par de aparelhos encaracolados.
Aqui está um exemplo:
Fio.novo coloca "Olá, mundo!"
Vamos fazer um programa simples que calcula a área de um círculo.
Área defin
pi = 3.14159
rad = 7.3
retornar (pi * rad * rad)
fim
Fio.novo
área()
coloca "correndo dentro do tópico!"
coloca "execução completa!"
Se você executar o exemplo acima, você notará que não obtemos a área do círculo. Isso ocorre porque Ruby não espera que os threads criados terminem a execução. Para garantir que os threads sejam concluídos, precisamos ligar para o método de junção.
O método de junção vai pausar a execução do tópico principal e aguardará os threads especificados no método de junção para concluir.
A seguir, é apresentado o código de exemplo acima com o método de junção implementado.
Área defin
pi = 3.14159
rad = 7.3
retornar (pi * rad * rad)
fim
thread = thread.novo
coloca "A área do círculo é #Area () cm2"
coloca "correndo dentro do tópico!"
fio.juntar
coloca "execução completa!"
Neste exemplo, obtemos a saída do encadeamento, como mostrado abaixo:
A área do círculo é 167.41533109999997 CM2
Correndo dentro do tópico!
Execução completa!
Encerrar um thread
Ruby fornece várias maneiras de encerrar um tópico. Uma dessas maneiras é usar o método de matar.
A sintaxe é:
Fio.matar (tópico)
Especifique o nome do thread para encerrar dentro dos parênteses.
Exceções de thread
Você notará que, se uma exceção surgir dentro de um tópico, a execução do programa não para.
Por exemplo:
def error_me
levantar "erro!"
fim
Fio.novo error_me
coloca "eu ainda corro"
No exemplo acima, levantamos uma exceção dentro da função passada para o tópico. Você notará duas coisas:
- O tópico não exibirá a mensagem de erro
- O código após o tópico ainda é executado.
Em alguns casos, convém parar de execução se uma exceção surgir dentro de um tópico. Podemos fazer isso usando o abort_on_execption.
Por exemplo:
Fio.abort_on_exception = true
thready = thread.novo do
coloca "eu corro antes da exceção"
levantar "exceção ocorreu!"
fim
Thready.juntar
coloca "Desculpe, eu não corro!"
No exemplo acima, o programa será encerrado se quando ocorrer uma execução dentro do tópico. Aqui está um exemplo de saída:
Eu corro antes da exceção
# encerrado com exceção (relatário_on_exception é verdadeiro):
tópicos.RB: 4: em 'Block in': exceção ocorreu! (RuntimeError)
tópicos.RB: 4: em 'Block in
': Exceção ocorreu! (RuntimeError) Variáveis de encadeamento
Variáveis criadas em um fio obedecem às regras do escopo do rubi. Eles só são acessíveis no escopo do tópico em que são criados.
Estados do tópico
Você pode buscar o estado de um determinado tópico usando o método de status. Você também pode usar o vivo para verificar se o tópico está em execução e pare para verificar se o tópico está morto.
Existem cinco valores de retorno para o método de status:
- Correndo - Retornos executados
- Dormir - retorna dormindo
- Abortar - Retorna abortando
- Encerrado com exceção - Retorna nil
- Rescindir normalmente - Retorna falsa.
Conclusão
Neste guia, discutimos o básico de trabalhar com tópicos na linguagem de programação do rubi.
É bom observar que há mais do que o que discutimos neste guia. Considere a documentação para saber mais.
Obrigado pela leitura!