<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Guax &#187; threads</title>
	<atom:link href="http://www.guax.net/tag/threads/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.guax.net</link>
	<description>“…is like having your brains smashed out by a slice of lemon wrapped round a large gold brick.”</description>
	<lastBuildDate>Mon, 21 Jun 2010 16:17:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Magia Negra das Threads em Python</title>
		<link>http://www.guax.net/2009/09/magia-negra-das-threads-em-python/</link>
		<comments>http://www.guax.net/2009/09/magia-negra-das-threads-em-python/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 00:42:56 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[desenvolvimento]]></category>
		<category><![CDATA[how to]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[threads]]></category>

		<guid isPermaLink="false">http://www.guax.net/?p=108</guid>
		<description><![CDATA[Certo dia estava eu a pensar sobre a vida o universo e tudo mais e antes que 42 viesse a minha mente foi pedido que eu implementasse um disparador de SMS&#8217;s. Para isso eu precisava fazer disparos simultâneos em X canais gsm. Requisito óbvio: preciso de threads. PHP, a linguagem que usamos para quase tudo [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_130" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.guax.net/wp-content/uploads/2009/09/Python_logo1.png" rel="lightbox[108]"><img class="size-full wp-image-130" title="Python Threads" src="http://www.guax.net/wp-content/uploads/2009/09/Python_logo1.png" alt="Python Threads" width="400" height="120" /></a><p class="wp-caption-text">Python Threads</p></div>
<p>Certo dia estava eu a pensar sobre a vida o universo e tudo mais e antes que 42 viesse a minha mente foi pedido que eu implementasse um disparador de SMS&#8217;s. Para isso eu precisava fazer disparos simultâneos em X canais gsm. Requisito óbvio: preciso de threads. PHP, a linguagem que usamos para quase tudo na aplicação não tem um suporte bom a threads então fui atrás de outra linguagem para o fazer.</p>
<p><a href="http://www.python.org/">Python</a> atravessou meu caminho e nas minhas brincadeiras com a cobra (ui!) eu apanhei, jesus sabe que eu apanhei dessa pseudo-linguagem medonha e caracu (eu xinguei de coisa pior enquanto era humilhado pela até então ignorância na linguagem). Eu apanhei por que o mau costume de só ter usado <a href="http://java.sun.com/">Java</a> (pausa para uivos e pedras&#8230;.) para trabalhar com threads me deixou preguiçoso e mau acostumado a uma declaração bem mais simples de <strong>sincronismo</strong> entre métodos, bastava um synchronized e tudo estava funcionando.</p>
<p>Python ao contrário de Java não é nada thread-safe. Todas as chamadas simples podem ser desastrosas se mexem com <strong>recursos compartilhados</strong> entre as threads.</p>
<h3>Sincronizando</h3>
<p>Já que a python não é thread-safe temos que assumir essa responsabilidade no lugar da linguagem e sincronizar as chamadas com Locks, Semáforos e afins. Não é o fim do mundo, mas que é chato, é. Se quizermos por exemplo fazer a inserção de dados no banco de dados e ter o resultado disso logo após cada insert devemos sincronizar os inserts e commits já que o componente MySQLdb não faz esse controle para nós.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Inserter<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, lck,db<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">self</span>.<span style="color: black;">lock</span> = lck<span style="color: #66cc66;">;</span>
        <span style="color: #008000;">self</span>.<span style="color: black;">db</span> = db
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> insert<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, insert<span style="color: black;">&#41;</span>:
        cursor = <span style="color: #008000;">self</span>.<span style="color: black;">db</span>.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>insert<span style="color: black;">&#41;</span>
            cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;commit&quot;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">finally</span>:
            <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<h3>Queue</h3>
<p>Outro componente muito útil quando se utiliza threads são as <strong>Filas</strong>. Filas são fifos (first-in first-out) que enfileiram ações que você gostaria que fossem executadas em paralelo por threads ou que simplesmente sejam executadas em determinada ordem.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># Importamos o módulo</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">Queue</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">Queue</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
            <span style="color: #ff7700;font-weight:bold;">try</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">self</span>.<span style="color: black;">fila</span>.<span style="color: black;">empty</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                    <span style="color: #ff7700;font-weight:bold;">break</span>
                item = <span style="color: #008000;">self</span>.<span style="color: black;">fila</span>.<span style="color: black;">get</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">finally</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">lock</span>.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
            <span style="color: #008000;">self</span>.<span style="color: black;">printer</span>.<span style="color: black;">imprime</span><span style="color: black;">&#40;</span>item<span style="color: black;">&#41;</span></pre></div></div>

<p>Uma nota sobre Filas é que não se deve usar um <code>if not queue.empty()</code> e depois tentar dar um <code>queue.get()</code> já que no tempo entre esses dois acessos aos métodos outra thread pode pegar o ultimo elemento. É necessário que você simplesmente pegue o elemento e trate a exceção ou use Lock nessa parte do método.</p>
<p>ps. estranho, mas python implementa LIFO (pilha) no modulo Queue. <img src='http://www.guax.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/2009/09/magia-negra-das-threads-em-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
