Vous êtes sur la page 1sur 11

Buscar

Threads en Python
Grails Case Study: www.orangeandbronze.com Grails development for the largest student rewards program in the US. Study Web Design 2012 www.Cam pusEx plorer.com /WebDesign Get Web Design Certified Local & Online Courses - Free Info Now! Curso de Python e Django Welcom eToTheDjango.Com .Br Aprenda Python e Django na Prtica! Garanta hoje sua vaga. AMQP meets JMS www.swiftm q.com AMQP 1.0 fully integrated with JMS, free AMQP 1.0 Client!

Twittear

Recomendar

QU SON LOS PROCESOS Y LOS THREADS?


Las computadoras seran mucho menos tiles si no pudiramos hacer ms de una cosa a la vez. Si no pudiramos, por ejemplo, escuchar msica en nuestro reproductor de audio favorito mientras leemos un tutorial de Python en Mundo Geek. Pero, cmo se consegua esto en computadoras antiguas con un solo ncleo / una sola CPU? Lo que ocurra, y lo que ocurre ahora, es que en realidad no estamos ejecutando varios procesos a la vez (se llama proceso a un programa en ejecucin), sino que los procesos se van turnando y, dada la velocidad a la que ejecutan las instrucciones, nosotros tenemos la impresin de que las tareas se ejecutan de forma paralela como si tuviramos multitarea real. Cada vez que un proceso distinto pasa a ejecutarse es necesario realizar lo que se llama un cambio de contexto , durante el cual se salva el estado del programa que se estaba ejecutando a memoria y se carga el estado del programa que va a entrar a ejecutarse. En Python podemos crear nuevos procesos mediante la funcin os.fork, que ejecuta la llamada al sistema fork, o mediante otras funciones ms avanzadas como popen2.popen2, de forma que nuestro programa pueda realizar varias tareas de forma paralela. Sin embargo el cambio de contexto puede ser relativamente lento, y los recursos necesarios para mantener el estado demasiados, por lo que a menudo es mucho ms eficaz utilizar lo que se conoce como threads, hilos de ejecucin, o procesos ligeros. Los threads son un concepto similar a los procesos: tambin se trata de cdigo en ejecucin. Sin embargo los threads se ejecutan dentro de un proceso, y los threads del proceso comparten recursos entre si, como la memoria, por ejemplo. El sistema operativo necesita menos recursos para crear y gestionar los threads, y al compartir recursos, el cambio de contexto es ms rpido. Adems, dado que los threads comparten el mismo espacio de memoria global, es sencillo compartir informacin entre ellos: cualquier variable global que tengamos en nuestro programa es vista por todos los threads.

Mundo geek es una web escrita por Ral Gonzlez Duque, dedicada principalmente a las nuevas tecnologas y la informtica.

Mundo geek on Facebook


Like 4,829 people like Mundo geek.

Jose A ntonio

Samuel

A lejandro

F acebook social plugin

Archivos Acerca Contacto T raducciones Wiki

EL GIL
La ejecucin de los threads en Python est controlada por el GIL (Global Interpreter Lock) de forma que slo un thread puede ejecutarse a la vez, independientemente del nmero de procesadores con el que cuente la mquina. Esto posibilita que el escribir extensiones en C para

converted by Web2PDFConvert.com

Python sea mucho ms sencillo, pero tiene la desventaja de limitar mucho el rendimiento, por lo que a pesar de todo, en Python, en ocasiones nos puede interesar ms utilizar procesos que threads, que no sufren de esta limitacin. Cada cierto nmero de instrucciones de bytecode la mquina virtual para la ejecucin del thread y elige otro de entre los que estaban esperando. Por defecto el cambio de thread se realiza cada 10 instrucciones de bytecode, aunque se puede modificar mediante la funcin sys.setcheckinterval. Tambin se cambia de thread cuando el hilo se pone a dormir con time.sleep o cuando comienza una operacin de entrada/salida, las cuales pueden tardar mucho en finalizar, y por lo tanto, de no realizar el cambio, tendramos a la CPU demasiado tiempo sin trabajar esperando a que la operacin de E/S terminara. Para minimizar un poco el efecto del GIL en el rendimiento de nuestra aplicacin es conveniente llamar al intrprete con el flag -O, lo que har que se genere un bytecode optimizado con menos instrucciones, y, por lo tanto, menos cambios de contexto. Tambin podemos plantearnos el utilizar procesos en lugar de threads, como ya comentamos, utilizando por ejemplo el mdulo processing; escribir el cdigo en el que el rendimiento sea crtico en una extensin en C o utilizar IronPython o Jython, que carecen de GIL.

THREADS EN PYTHON
El trabajo con threads se lleva a cabo en Python mediante el mdulo thread. Este mdulo es opcional y dependiente de la plataforma, y puede ser necesario, aunque no es comn, recompilar el intrprete para aadir el soporte de threads. Adems de thread, tambin contamos con el mdulo threading que se apoya en el primero para proporcionarnos una API de ms alto nivel, ms completa, y orientada a objetos. El mdulo threading se basa ligeramente en el modelo de threads de Java. El mdulo threading contiene una clase Thread que debemos extender para crear nuestros propios hilos de ejecucin. El mtodo run contendr el cdigo que queremos que ejecute el thread. Si queremos especificar nuestro propio constructor, este deber llamar a threading.Thread.__init__(self) para inicializar el objeto correctamente.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06. 07. 08. 09.

import threading class MiThread(threading.Thread): def __init__(self, num): threading.Thread.__init__(self) self.num = num def run(self): print "Soy el hilo", self.num

Para que el thread comience a ejecutar su cdigo basta con crear una instancia de la clase que acabamos de definir y llamar a su mtodo start. El cdigo del hilo principal y el del que acabamos de crear se ejecutarn de forma concurrente.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06.

print "Soy el hilo principal" for i in range(0, 10): t = MiThread(i) t.start() t.join()

El mtodo join se utiliza para que el hilo que ejecuta la llamada se bloquee hasta que finalice el thread sobre el que se llama. En este caso se utiliza para que el hilo principal no termine su ejecucin antes que los hijos, lo cul podra resultar en algunas plataformas en la terminacin de los hijos antes de finalizar su ejecucin. El mtodo join puede tomar como parmetro un nmero en coma flotante indicando el nmero mximo de segundos a esperar. Si se intenta llamar al mtodo start para una instancia que ya se est ejecutando, obtendremos una excepcin. La forma recomendada de crear nuevos hilos de ejecucin consiste en extender la clase Thread, como hemos visto, aunque tambin es posible crear una instancia de Thread directamente, e indicar como parmetros del constructor una clase ejecutable (una clase con el mtodo especial __call__) o una funcin a ejecutar, y los argumentos en una tupla (parmetro args) o un diccionario (parmetro kwargs).
view plain copy to clipboard print ?

converted by Web2PDFConvert.com

01. 02. 03. 04. 05. 06. 07. 08. 09. 10.

import threading def imprime(num): print "Soy el hilo", num print "Soy el hilo principal" for i in range(0, 10): t = threading.Thread(target=imprime, args=(i, )) t.start()

Adems de los parmetros target, args y kwargs tambin podemos pasar al constructor un parmetro de tipo cadena name con el nombre que queremos que tome el thread (el thread tendr un nombre predeterminado aunque no lo especifiquemos); un parmetro de tipo booleano verbose para indicar al mdulo que imprima mensajes sobre el estado de los threads para la depuracin y un parmetro group, que por ahora no admite ningn valor pero que en el futuro se utilizar para crear grupos de threads y poder trabajar a nivel de grupos. Para comprobar si un thread sigue ejecutndose, se puede utilizar el mtodo isAlive. Tambin podemos asignar un nombre al hilo y consultar su nombre con los mtodos setName y getName. Mediante la funcin threading.enumerate obtendremos una lista de los objetos Thread que se estn ejecutando, incluyendo el hilo principal (podemos comparar el objeto Thread con la variable main_thread para comprobar si se trata del hilo principal) y con threading.activeCount podemos consultar el nmero de threads ejecutndose. Los objetos Thread tambin cuentan con un mtodo setDaemon que toma un valor booleano indicando si se trata de un demonio. La utilidad de esto es que si solo quedan threads de tipo demonio ejecutndose, la aplicacin terminar automticamente, terminando estos threads de forma segura. Por ltimo tenemos en el mdulo threading una clase Timer que hereda de Thread y cuya utilidad es la de ejecutar el cdigo de su mtodo run despus de un periodo de tiempo indicado como parmetro en su constructor. Tambin incluye un mtodo cancel mediante el que cancelar la ejecucin antes de que termine el periodo de espera.

SINCRONIZACIN
Uno de los mayores problemas a los que tenemos que enfrentarnos al utilizar threads es la necesidad de sincronizar el acceso a ciertos recursos por parte de los threads. Entre los mecanismos de sincronizacin que tenemos disponibles en el mdulo threading se encuentran los locks, locks reentrantes, semforos, condiciones y eventos. Los locks, tambin llamados mutex (de mutual exclusion ), cierres de exclusin mutua, cierres o candados, son objetos con dos estados posibles: adquirido o libre. Cuando un thread adquiere el candado, los dems threads que lleguen a ese punto posteriormente y pidan adquirirlo se bloquearn hasta que el thread que lo ha adquirido libere el candado, momento en el cul podr entrar otro thread. El candado se representa mediante la clase Lock. Para adquirir el candado se utiliza el mtodo acquire del objeto, al que se le puede pasar un booleano para indicar si queremos esperar a que se libere ( True) o no ( False). Si indicamos que no queremos esperar, el mtodo devolver True o False dependiendo de si se adquiri o no el candado, respectivamente. Por defecto, si no se indica nada, el hilo se bloquea indefinidamente. Para liberar el candado una vez hemos terminado de ejecutar el bloque de cdigo en el que pudiera producirse un problema de concurrencia, se utiliza el mtodo release.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14.

lista = [] lock = threading.Lock() def anyadir(obj): lock.acquire() lista.append(obj) lock.release() def obtener(): lock.acquire() obj = lista.pop() lock.release() return obj

La clase RLock funciona de forma similar a Lock, pero en este caso el candado puede ser adquirido por el mismo thread varias veces, y no quedar liberado hasta que el thread llame a release tantas veces como llam a acquire. Como en Lock, y como en todas las primitivas de
converted by Web2PDFConvert.com

sincronizacin que veremos a continuacin, es posible indicar a acquire si queremos que se bloquee o no. Los semforos son otra clase de candados. La clase correspondiente, Semaphore, tambin cuenta con mtodos acquire y release, pero se diferencia de un Lock normal en que el constructor d e Semaphore puede tomar como parmetro opcional un entero value indicando el nmero mximo de threads que pueden acceder a la vez a la seccin de cdigo crtico. Si no se indica nada permite el acceso a un solo thread. Cuando un thread llama a acquire, la variable que indica el nmero de threads que pueden adquirir el semforo disminuye en 1, porque hemos permitido entrar en la seccin de cdigo crtico a un hilo ms. Cuando un hilo llama a release, la variable aumenta en 1. No es hasta que esta variable del semforo es 0, que llamar a acquire producir un bloqueo en el thread que realiz la peticin, a la espera de que algn otro thread llame a release para liberar su plaza. Es importante destacar que el valor inicial de la variable tal como lo pasamos en el constructor, no es un lmite mximo, sino que mltiples llamadas a release pueden hacer que el valor de la variable sea mayor que su valor original. Si no es esto lo que queremos, podemos utilizar la clase BoundedSemaphore en cuyo caso, ahora si, se considerara un error llamar a release demasiadas veces, y se lanzara una excepcin de tipo ValueError de superarse el valor inicial. Podramos utilizar los semforos, por ejemplo, en un pequeo programa en el que mltiples threads descargaran datos de una URL, de forma que pudieramos limitar el nmero de conexiones a realizar al sitio w eb para no bombardear el sitio con cientos de peticiones concurrentes.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06.

semaforo = threading.Semaphore(4) def descargar(url): semaforo.acquire() urllib.urlretrieve(url) semaforo.release()

Las condiciones (clase Condition) son de utilidad para hacer que los threads slo puedan entrar en la seccin crtica de darse una cierta condicin o evento. Para esto utilizan un Lock pasado como parmetro, o crean un objeto RLock automaticamente si no se pasa ningn parmetro al constructor. Son especialmente adecuadas para el clsico problema de productor-consumidor. La clase cuenta con mtodos acquire y release, que llamarn a los mtodos correspondientes del candado asociado. Tambin tenemos mtodos wait, notify y notifyAll. El mtodo wait debe llamarse despus de haber adquirido el candado con acquire. Este mtodo libera el candado y bloquea al thread hasta que una llamada a notify o notifyAll en otro thread le indican que se ha cumplido la condicin por la que esperaba. El thread que informa a los dems de que se ha producido la condicin, tambin debe llamar a acquire antes de llamar a notify o notifyAll. Al llamar a notify, se informa del evento a un solo thread, y por tanto se despierta un solo thread. Al llamar a notifyAll se despiertan todos los threads que esperaban a la condicin. Tanto el thread que notifica como los que son notificados tienen que terminar liberando el lock con release.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15.

lista = [] cond = threading.Condition() def consumir(): cond.acquire() cond.wait() obj = lista.pop() cond.release() return obj def producir(obj): cond.acquire() lista.append(obj) cond.notify() cond.release()

Los eventos, implementados mediante al clase Event, son un w rapper por encima de Condition

converted by Web2PDFConvert.com

y sirven principalmente para coordinar threads mediante seales que indican que se ha producido un evento. Los eventos nos abstraen del hecho de que estemos utilizando un Lock por debajo, por lo que carece de mtodos acquire y release. El thread que debe esperar el evento llama al mtodo wait y se bloquea, opcionalmente pasando como parmetro un nmero en coma flotante indicando el nmero mximo de segundos a esperar. Otro hilo, cuando ocurre el evento, manda la seal a los threads bloqueados a la espera de dicho evento utilizando el mtodo set. Los threads que estaban esperando se desbloquean una vez recibida la seal. El flag que determina si se ha producido el evento se puede volver a establecer a falso usando clear. Como vemos los eventos son muy similares a las condiciones, a excepcin de que se desbloquean todos los threads que esperaban el evento y que no tenemos que llamar a acquire y release.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.

import threading, time class MiThread(threading.Thread): def __init__(self, evento): threading.Thread.__init__(self) self.evento = evento def run(self): print self.getName(), "esperando al evento" self.evento.wait() print self.getName(), "termina la espera" evento = threading.Event() t1 = MiThread(evento) t1.start() t2 = MiThread(evento) t2.start() # Esperamos un poco time.sleep(5) evento.set()

Por ltimo, un pequeo extra. Si sois usuarios de Java sin duda estaris echando en falta una palabra clave syncronized para hacer que slo un thread pueda acceder al mtodo sobre el que se utiliza a la vez. Una construccin comn es el uso de un decorador para implementar esta funcionalidad usando un Lock. Sera algo as:
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15.

def synchronized(lock): def dec(f): def func_dec(*args, **kwargs): lock.acquire() try: return f(*args, **kwargs) finally: lock.release() return func_dec return dec class MyThread(threading.Thread): @synchronized(mi_lock) def run(self): print "metodo sincronizado"

DATOS GLOBALES INDEPENDIENTES


Como ya hemos comentado los threads comparten las variables globales. Sin embargo pueden existir situaciones en las que queramos utilizar variables globales pero que estas variables se comporten como si fueran locales a un solo thread. Es decir, que cada uno de los threads tengan valores distintos independientes, y que los cambios de un determinado thread sobre el valor no se vean reflejados en las copias de los dems threads. Para lograr este comportamiento se puede utilizar la clase threading.local, que crea un almacn de datos locales. Primero debemos crear una instancia de la clase, o de una subclase, para despus almacenar y obtener los valores a travs de parmetros de la clase.
view plain copy to clipboard print ?

01. 02. 03.

datos_locales = threading.local() datos_locales.mi_var = "hola" print datos_locales.mi_var

Fijmonos en el siguiente cdigo, por ejemplo. Para el hilo principal el objeto local tiene un atributo var, y por lo tanto el print imprime su valor sin problemas. Sin embargo para el hilo t ese atributo no existe, y por lo tanto lanza una excepcin.
view plain copy to clipboard print ?

converted by Web2PDFConvert.com

01. 02. 03. 04. 05. 06. 07. 08. 09. 10.

local = threading.local() def f(): print local.var local.var = "hola" t = threading.Thread(target=f) print local.var t.start() t.join()

COMPARTIR INFORMACIN
Para compartir informacin entre los threads de forma sencilla podemos utilizar la clase Queue.Queue, que implementa una cola (una estructura de datos de tipo FIFO) con soporte multihilo. Esta clase utiliza las primitivas de threading para ahorrarnos tener que sincronizar el acceso a los datos nosotros mismos. El constructor de Queue toma un parmetro opcional indicando el tamao mximo de la cola. Si no se indica ningn valor no hay lmite de tamao. Para aadir un elemento a la cola se utiliza el mtodo put(item); para obtener el siguiente elemento, get(). Ambos mtodos tienen un parmetro booleano opcional block que indica si queremos que se espere hasta que haya algn elemento en la cola para poder devolverlo o hasta que la cola deje de estar llena para poder introducirlo. Tambin existe un parmetro opcional timeout que indica, en segundos, el tiempo mximo a esperar. Si el timeout acaba sin poder haber realizado la operacin debido a que la cola estaba llena o vaca, o bien si block era False, se lanzar una excepcin de tipo Queue.Full o Queue.Empty, respectivamente. Con qsize obtenemos el tamao de la cola y con empty() e full() podemos comprobar si est vaca o llena.
view plain copy to clipboard print ?

01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.

q = Queue.Queue() class MiThread(threading.Thread): def __init__(self, q): self.q = q threading.Thread.__init__(self) def run(self): while True: try: obj = q.get(False) except Queue.Empty: print "Fin" break print obj for i in range(10): q.put(i) t = MiThread(q) t.start() t.join()

Java Free Download


Find more sources/options for Java Free Download
www.webcrawler.com

Estambres mexicanos
Estambres La Pantera Rosa, Omega Espiga, Rafia, Costuras y Revistas
www.hilosyestam bres.com

Curso de Visual Basic.Net


Curso con Certificado Universitario de Visual Basic.NET. Inscribase ya!
www.Aprender21.com /Cursos_VB_Net

lock, python, queue, sem aforos, threading, threads, tutorial

COMENTARIOS
converted by Web2PDFConvert.com

HED Llevo aprendiendo Python desde hace un poquito tiempo, por entretenerme ms que nada y me estaba gustando bastante. Pero esto que cuentas de los hilos me deja perplejo perplejito que dira Flanders -. Qu sentido tiene permitir que nicamente se ejecute un hilo? Teniendo en cuenta que hoy en da empiezan a abundar las mquinas con varios ncleos creo que es una patada en la boca. Supongo que habr alguna razn de peso para que esto sea as, pero es que no se me ocurre ninguna, porque que para poder aprovechar los procesadores de varios ncleos haya que utilizar procesos en lugar de hilos no me parece muy normal. Por curiosidad no sabrs a qu se debe no? Saludos.
Responder

Zootropo Pues es algo que Guido responde cada cierto tiempo. De hecho es una de las cosas que responde en el FAQ de Python 3000. Lo primero es que al menos el GIL se libera antes de operaciones de E/S o cuando el proceso se pone a dormir que es una de las situaciones donde ms tiempo , perderas. Luego en programas normales las mejoras en tiempo tampoco seran tan absurdamente enormes. Luego, que Python tampoco est enfocado a aplicaciones en las que el rendimiento sea crtico. En todo caso mezclaras C y Python, y ya no tendras problemas con el GIL. Por otro lado consideran que tienes suficientes alternativas. Y que los threads tampoco son algo a alentar. Otras sugerencias: Parallel Processing and Multiprocessing in Python Adems hace unos aos escribieron una versin de Python que no usaba el GIL y mientras que las mejoras de rendimiento en varios ncleos no eran espectaculares, para mquinas de un solo ncleo se empeoraba bastante. Por cierto, Ruby tambin usa algo parecido al GIL, ahora que lo pienso Aqu tienes una de estas discusiones, por si te interesa profundizar un poco ms: It isnt Easy to Remove the GIL Evidentemente a m lo que me gustara es una implementacin que sacara todo el partido de los multi ncleo sin perder mucho rendimiento en mono ncleo. Pero bueno, es de las pocas cosas malas de Python que me vienen a la cabeza y tampoco es algo que me afecte mucho.
Responder

yiTaN! Zootropo, lo cierto es que soy un poco trozo en Python y he estado aprendiendo gracias a tus tutoriales, aunque est bastante verde. An as, quiero darte las gracias especialmente por esta entrada porque, justamente, estoy dando esto ahora mismo en la uni (de hecho, el prximo martes tengo el exmen) y me sirve para practicar Lo dicho, muchas gracias por estos tutoriales. Son buensimos
Responder

Zootropo El examen es de threads en Python, yiTaN!? o de procesos y threads en un curso de sistemas operativos?
Responder

ricardo galli Sigo con atencin tus apuntes de Python, as que van aqu una serie de

converted by Web2PDFConvert.com

matizaciones sobre los Locks, Semforos y cerrojos. Lock y RLock en Python *son* un subconjunto de los semforos (binarios) que sirven fundamentalmente para exclusin mutua. El nombre correcto sera semforos binarios, o semforos mutex o mutex para ser simples. La abstraccin de semforo fue inventada por Dijkstra en 1974 y si no recuerdo mal fueron inicialmente binarios, luego extendidos a los semforos contadores (son semnticamente equivalentes). De all que los semforos sean generalmente contadores a diferencia de los binarios ms simples generalmente llamados mutex (y que se pueden implementar de forma ms eficiente). Se suele usar la traduccin cerrojo a los spinlocks. Pero estos son bestias diferentes y a diferencia de los semforos/mutex s tienen espera activa (normalmente implementado con instrucciones especficas de hardware como el test&set o swap con el objetivo de asegurar atomicidad, especialmente en multiprocesadores). Otra matizacin: > Para minimizar un poco el efecto del GIL en el rendimiento de nuestra aplicacin es conveniente llamar al intrprete con el flag -O, lo que har que se genere un bytecode optimizado con menos instrucciones, y, por lo tanto, menos cambios de contexto. En realidad no se produce cambio de contexto, todos los threads se ejecutan en el mismo contexto que el intrprete Python. La optimizacin viene por una reduccin del overhead al ejecutarse ms operaciones efectivas entre cada verificacin. PS: cundo podrs disponible todos los apuntes de Python en un slo PDF o HTML? As se los paso a mis alumnos
Responder

Zootropo Gracias por las notas Ricardo, siempre es un placer leerte Antes de crear un PDF o un HTML tengo que pensar un ttulo, y decidir si usar Open Office.org, Word, LaTeX o directamente un programa de maquetado como Scribus o Quark Xpress
Responder

Gandhi De nuevo, mil gracias. Avanzo ms con tus tutoriales que con lo que doy en clase de Python
Responder

servo Ms! http://www .parallelpython.com/


Responder

yiTaN! @ Zootropo: Perdona por no responderte antes. No, el examen no es en Python. Es realmente de concurrencia, y problemas de sincronizacin entre procesos e hilos ejecutados concurrentemente. Lo que digo es que con esto puedo practicar ms que con pseudocdigo feo
Responder

ricardo galli Zootropo, yo lo hara fcil. Un c&p de los artculos que hayas escrito en OOo, pones un ttulo provisional, por ejemplo Python en MundoGeek y cada vez que agregas
converted by Web2PDFConvert.com

un apunte nuevo lo vas agregando como captulo y generas un PDF . As puedes poner en cada apunte: bajarse el PDF. Luego, cuando tengas ganas lo mejoras y publicas en Lulu o Bubok yiTaN, prueba con las Ada Tasks y disfruta
Responder

Julius Zoo!! Una pregunta que fuente es esa y que editor de texto usas? Me recuerda a consolas pero nunca he conseguido que se viera as de bien esa fuente en ubuntu Saludos!!
Responder

Julius esto. acabo de darme cuenta de que no son screenshots jajaja ignora el comentario anterior :blush:
Responder

casper Buenas, Julius, usa geany, es el que uso y es bastante bueno salu2
Responder

David Esquivel Que buen tutorial. Muchas gracias.


Responder

Python hasta 5 veces ms rpido? [...] virtual de Python y acabando con la necesidad de limitar la ejecucin de los threads a travs del GIL (Global Interpreter Lock), entre [...]
Responder

lopz Hola Esto de los hilos es interesante, pero aqu hablas del mdulo threading, por que no hablar del mdulo a ms bajo nivel que es thread y hablar de como usarlo, ventajas, desventajas, y como no, bien explicado como lo haces siempre. Y s que para eso est este mdulo, pero nunca hace dao saber algo dems a Saludos!
Responder

Isaak (kaasi) 's status on Thursday, 24-Sep-09 14:54:22 UTC - Identi.ca [...] /me leyendo sobre threads en http://mundogeek.net/archivos/2008/04/18/threads-en-python/ [...]
Responder

python

converted by Web2PDFConvert.com

leonel Estoy buscando la forma de poner mi programa en el la barra de tareas, como cuando uno minimiza el jdownloader. Y estoy utilizando tkinter pero ya llevo varios o dias buscando la forma, y no la encuentro. Si alguno conoce el nombre del metodo que me sirve, y un script de ejemplo de como se usa en tkinter. Favor enviarmelo a este correo leoan91@hotmail.com. De paso le agradezco su colaboracin, y este comentario lo escribi aqui porque no encontre un lugar ms apropiado para hacerlo. Gracias.
Responder

Francisco Pozo Muy tiles me han parecido. Tena un problema en python justamente con este tema y me lo han resuelto entero. Muchas gracias por este aporte.
Responder

jiuck Muchas gracias por este pedazo de artculo! Todo est explicado perfectamente. Se entiende a la primera todo lo que quieres decir. Muuuchas gracias, de verdad!
Responder

Diego Uribe Gamez Muy buen articulo, me ayudo mucho. Gracias.


Responder

Julio A. Muy bueno!!! Me ayudo un monton!


Responder

Alberto Hola soy nuevo en esto de la programacin pero soy un usuario muy avanzado de la computacion, quisiera saber que programa se debe utilizar para poder practicar este lenguaje en win7 y en ubuntu y cual es mas conveniente practicar java, c, o este espero me puedan orientar.
Responder

nbensa Hola. En el mtodo run del ltimo ejemplo, la lnea: obj = q.get(False) no debera ser: obj = self.q.get(False) ? Gracias.
Responder

DEJA UN COMENTARIO

converted by Web2PDFConvert.com

Nom bre em (no se m ail ostrar) T web (opcional) u

Enviar comentario

Aviso legal

converted by Web2PDFConvert.com

Vous aimerez peut-être aussi