quarta-feira, 24 de novembro de 2010

Threads e sua criação

Introdução a Threads

Threads em inglês significa linha de execução, é uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser executadas concorrentemente (fonte: Wikipédia)

Um pouco de história

Dentro de um sistema operacional temos as funções de threads em nosso dia a dia, hoje em dia todos os SOs trabalham com multi-threads, pois quem se lembra do antigo MS-DOS ou das primeiras versões doGNU/Linux sabe que não era possível executar mais de uma tarefa ao mesmo tempo, já que qualquer tarefa executada dentro do SO tomava 100% do processador. Após alguns anos foi visto que muitas aplicações não tomavam 100% do processamento do processador, isso era uma grande perda de tempo dentro dos SOs. Até que foi criada a ideia de multi-threads, onde se dividiam as linhas de execução dentro do SO aumentando sua eficiência.

Não apenas nos SOs temos threads. Processadores Intel também possuem threads para aumentar sua eficiência. Os processadores Pentium HT foram os primeiros da Intel a terem multi-threads implementados onde seu SO entendia que havia dois processadores, mas na verdade havia um com duas threads, que auxiliavam na execução do seu SO e aplicações.

Threads no seu dia-a-dia

Muitos desenvolvedores iniciantes nem sabem o que são threads e muito menos sabem qual a sua função dentro de um software. Isso é muito ruim, pois se temos um jovem programador que compra um Quad-core da Intel achando que sua aplicação vai funcionar mais rápido pois vai trabalhar com quatro núcleos ao invés de um está completamente errado. Pois se o programador desenvolver um software usando orientação a objeto ou uma linguagem estruturada muito complexo, onde tem que fazer, por exemplo, 40 comparações entre strings gigantescas e para isso usam uma classe ou uma função onde após comparar uma vai para a próxima e assim sucessivamente. Não adiante ter um dual - core, quad-core ou um octa-core, pois o problema está na forma do desenvolvimento.

Para um problema como esse você deve usar o máximo de seu processador, caso você resolva fazer isso em C sem usar nenhuma forma de multi-thread, ele vai usar apenas um núcleo de seu super computador. E assim todo o dinheiro investido em um processador muito eficiente não valeu de nada. Neste caso o ideal para um quad-core seria o programador usar pelo menos 4 threads para esse problema. Pois o SO iria ser o responsável por enviar os dados para os núcleos do processador. Assim aumentando a eficiência do software, sendo assim iria aumentar a eficiência em pelo menos quatro vezes.

Esta forma de programação é chamada de programação concorrente, onde temos um software que processa dados em várias threads otimizando o resultado final.

Criando Threads em Python

Agora vamos ver como funciona a criação de threads dentro do Python 3.1, logo após entendermos o que é uma thread vamos entender como as threads dentro do Python funcionam.

Dentro do Python as funções de threads estão dentro de uma classe chamada threading.Threads, esta classe tem todas as funções necessárias para manutenção de threads dentro do Python, antes de utilizá-la você deve importar o modulo threading usando "import. threading", mas para podermos utilizá-la precisamos criar uma nova classe que irá herdar da classe threading.Threads da seguinte forma:
Nesta linha de código você acabou de herdar todos os métodos da classe threading.Thread. Após você ter feito a herança você deve adicionar uma linha no seu construtor __init__, a linha a ser adicionada deve ser:
Esta linha será a responsável por inicializar a thread dentro do SO. Após isso, e após a criação de todos os métodos você deve criar mais um método chamado run(self): este método é o que vai executar sua thread, este método é sobrecarregado da classe pai, onde dentro dele você deve fazer as chamadas de funções ou de outras classes, pois devemos lembrar que esta classe é apenas uma classe para threads, dentro dela que você pode inserir seus cálculos etc.

O exemplo que eu vou apresentar agora é uma forma de calcular fatoriais usando threads, como Python é uma linguagem filha do Haskell (linguagem funcional) o cálculo do fatorial mesmo usando um for é extremamente rápido. Por isso usamos a classe threading.Timer para ter uma demora maior como se estivesse calculando por mais tempo apenas para perceber o resultado final.

Código do programa

Neste código podemos ver que o construtor (__init__) recebe dois parâmetros, o parâmetro number é o valor que será calculado. O parâmetro time, que define quanto tempo essa thread vai demorar a retornar o valor. Após isso temos o método run(self), nele executamos o fatorial.

Após o for do fatorial temos a declaração da classe threading.Timer(), esta classe recebe dois parâmetros de entrada. O primeiro é o tempo que vai ser executada o segundo parâmetro é a função que deve ser executada depois desse tempo determinado. Como o nosso cálculo é feito dentro da run() foi criada uma função timef(self) sem execução para poder criar o objeto. Após a criação devemos chamar o método t.start() para iniciar a Thread de tempo. Mas, se você apenas mandar iniciar essa thread, sua classe irá finalizar e irá imprimir na tela o resultado e o tempo irá correr em paralelo. Para apresentar o resultado só quando o objeto t terminar o tempo devemos chamar o método t.join() onde irá continuar o código só quando essa Thread terminar. Após isso nosso método é finalizado.

Agora é só fazer uma chamada para essa classe e ver o resultado, segue um exemplo que eu fiz:
Executem este exemplo e boa sorte com as threads. Espero que tenham gostado!

FONTE: VIVAOLINUX

0 comentários:

Postar um comentário

 
Design by Eddy Oliveira