<?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; python</title>
	<atom:link href="http://www.guax.net/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.guax.net/blog</link>
	<description>“…is like having your brains smashed out by a slice of lemon wrapped round a large gold brick.”</description>
	<lastBuildDate>Sun, 22 May 2011 14:22:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Slackpkg Notifier</title>
		<link>http://www.guax.net/blog/2011/05/slackpkg-notifier/</link>
		<comments>http://www.guax.net/blog/2011/05/slackpkg-notifier/#comments</comments>
		<pubDate>Sun, 22 May 2011 14:22:34 +0000</pubDate>
		<dc:creator>guax</dc:creator>
				<category><![CDATA[slackware]]></category>
		<category><![CDATA[pyGTK]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[slackpkg]]></category>
		<category><![CDATA[slackpkg-notifier]]></category>
		<category><![CDATA[wicd]]></category>

		<guid isPermaLink="false">http://www.guax.net/blog/?p=487</guid>
		<description><![CDATA[A algum tempo atrás fiz um programinha que mantém um icone na systray para notificar se havia alguma atualização para o Slackware. Feito em python e pyGTK usando o código do wicd como base ele funciona em usermode e fica bonitinho no XFCE. Coloquei o código no github para algum interessado. Repositório: https://github.com/guax/slackpkg-notifier]]></description>
			<content:encoded><![CDATA[<p>A algum tempo atrás fiz um programinha que mantém um icone na systray para notificar se havia alguma atualização para o Slackware. Feito em python e pyGTK usando o código do wicd como base ele funciona em usermode e fica bonitinho no XFCE. Coloquei o código no github para algum interessado. <img src='http://www.guax.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Repositório: <a href="https://github.com/guax/slackpkg-notifier">https://github.com/guax/slackpkg-notifier</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/blog/2011/05/slackpkg-notifier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Magia Negra das Threads em Python</title>
		<link>http://www.guax.net/blog/2009/09/magia-negra-das-threads-em-python/</link>
		<comments>http://www.guax.net/blog/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"><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>
<pre lang="python">class Inserter(object):
    def __init__(self, lck,db):
        self.lock = lck;
        self.db = db

    def insert(self, insert):
        cursor = self.db.cursor()
        try:
            self.lock.acquire()
            cursor.execute(insert)
            cursor.execute("commit")
        finally:
            self.lock.release()</pre>
<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>
<pre lang="python"># Importamos o módulo
from Queue import Queue

def run(self):
        while True:
            try:
                self.lock.acquire();
                if self.fila.empty():
                    break
                item = self.fila.get()
            finally:
                self.lock.release()

            self.printer.imprime(item)</pre>
<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/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.guax.net/blog/2009/09/magia-negra-das-threads-em-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

