{ "metadata": { "name": "Capitulo26_Threads" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n", "===================================\n", "2ª edi\u00e7\u00e3o, revisada e ampliada\n", "-----------------------------------\n", "\n", "Cap\u00edtulo 26: Threads\n", "=============================\n", "_____________________________\n", "Uma *thread* \u00e9 uma linha de execu\u00e7\u00e3o que compartilha sua \u00e1rea de mem\u00f3ria com outras linhas, ao contr\u00e1rio do processo tradicional, que possui apenas uma linha com \u00e1rea de mem\u00f3ria pr\u00f3pria.\n", "\n", "![Exemplo de threads num processo](files/bpypd_diags37.png)\n", "\n", "O uso de *threads* oferece algumas vantagens em rela\u00e7\u00e3o aos processos convencionais:\n", "\n", "+ Consomem menos recursos de m\u00e1quina.\n", "+ Podem ser criadas e destru\u00eddas mais rapidamente.\n", "+ Podem ser chaveadas mais rapidamente.\n", "+ Podem se comunicar com outras *threads* de forma mais f\u00e1cil.\n", "\n", "\u00c9 comum utilizar *threads* para:\n", "\n", "+ Processamento paralelo, em casos como atender v\u00e1rias conex\u00f5es em processos servidores.\n", "+ Executar opera\u00e7\u00f5es de I/O ass\u00edncronas, por exemplo: enquanto o usu\u00e1rio continua interagindo com a interface enquanto a aplica\u00e7\u00e3o envia um documento para a impressora.\n", "+ Opera\u00e7\u00f5es de I/O em paralelo.\n", "\n", "Em Python, o m\u00f3dulo da biblioteca padr\u00e3o *threading* prov\u00ea classes de alto n\u00edvel de abstra\u00e7\u00e3o e usa o m\u00f3dulo *thread*, que implementa as rotinas de baixo n\u00edvel e geralmente n\u00e3o \u00e9 usado diretamente.\n", "\n", "Exemplo com o m\u00f3dulo *threading*:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "Exemplo de uso de threads\n", "\"\"\"\n", "\n", "import os\n", "import time\n", "import threading\n", "\n", "\n", "class Monitor(threading.Thread):\n", " \"\"\"\n", " Classe de monitoramento usando threads\n", " \"\"\"\n", " def __init__(self, ip):\n", " \"\"\"\n", " Construtor da thread\n", " \"\"\"\n", " # Atributos para a thread\n", " self.ip = ip\n", " self.status = None\n", "\n", " # Inicializador da classe Thread\n", " threading.Thread.__init__(self)\n", "\n", " def run(self):\n", " \"\"\"\n", " C\u00f3digo que ser\u00e1 executado pela thread\n", " \"\"\"\n", " # Execute o ping\n", " ping = os.popen('ping -n 1 %s' % self.ip).read()\n", "\n", " if 'Esgotado' in ping:\n", " self.status = False\n", " else:\n", " self.status = True\n", "\n", "\n", "if __name__ == '__main__':\n", "\n", " # Crie uma lista com um objeto de thread para cada IP\n", " monitores = []\n", " for i in range(1, 11):\n", "\n", " ip = '10.10.10.%d' % i\n", " monitores.append(Monitor(ip))\n", "\n", " # Execute as Threads\n", " for monitor in monitores:\n", " monitor.start()\n", "\n", " # A thread principal continua enquanto\n", " # as outras threads executam o ping\n", " # para os endere\u00e7os da lista\n", "\n", " # Verifique a cada segundo\n", " # se as threads acabaram\n", " ping = True\n", "\n", " while ping:\n", " ping = False\n", "\n", " for monitor in monitores:\n", " if monitor.status == None:\n", " ping = True\n", " break\n", " \n", " time.sleep(1)\n", "\n", " # Imprima os resultados no final\n", " for monitor in monitores:\n", "\n", " if monitor.status:\n", " print '%s no ar' % monitor.ip\n", " else:\n", " print '%s fora do ar' % monitor.ip" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "10.10.10.1 no ar\n", "10.10.10.2 no ar\n", "10.10.10.3 no ar\n", "10.10.10.4 no ar\n", "10.10.10.5 no ar\n", "10.10.10.6 no ar\n", "10.10.10.7 no ar\n", "10.10.10.8 no ar\n", "10.10.10.9 no ar\n", "10.10.10.10 no ar\n" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "\u00c9 importante observar que, quando o processo morre, todas as suas *threads* terminam.\n", "\n", "Na vers\u00e3o 2.6, est\u00e1 dispon\u00edvel tamb\u00e9m o m\u00f3dulo *multiprocessing*, que implementa classes para a cria\u00e7\u00e3o de processos e a comunica\u00e7\u00e3o entre eles." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }