[pyar] Bloqueo de Deferreds, deferToThread en Twisted y threads en Python, no los entiendo :(

Emiliano Dalla Verde Marcozzi edvm en member.fsf.org
Vie Oct 14 11:49:07 ART 2011


Buenas querida lista!
Les quiero mostrar un poco de codigo que es un sistemita de tareas
periodicas con plugins:
http://pastebin.com/gCrRpChr

En el pastebin, en la parte superior figura el codigo del 'Task Manager'.
Venimos usando deferToThread
para lanzar tareas que pueden demorar tiempo y que no bloquee el resto de
las tareas que debemos
ejecutar. Luego de ver la charla de Lucio sobre Twisted, quise probar de
hacer lo mismo con Deferreds,
de ahi que meti un metodo 'toDefer' que acepta una funcion como parametro,
crea un deferred, le atacheo
la funcion callFunction y luego le seteo el valor del deferred al metodo que
fue pasado como parametro
para que se dispare el 'chain'. La cuestion, es que al crear una tarea que
tiene un sleep de 10 segundos,
puedo ver en el log como me bloquea la ejecucion de las siguientes tareas:

2011-10-14 11:23:02-0300 [-] starting to sleep ... zZzZz ...
2011-10-14 11:23:12-0300 [-] Whoops!, now i woke up!
2011-10-14 11:23:12-0300 [-] executed    blocking_task
2011-10-14 11:23:12-0300 [-] executed    ajustarhora
2011-10-14 11:23:12-0300 [-] executed    service_to_manual
2011-10-14 11:23:12-0300 [-] executed    ajustarhora
2011-10-14 11:23:13-0300 [-] executed    ajustarhora
2011-10-14 11:23:14-0300 [-] starting to sleep ... zZzZz ...
2011-10-14 11:23:24-0300 [-] Whoops!, now i woke up!
2011-10-14 11:23:24-0300 [-] executed    blocking_task
2011-10-14 11:23:24-0300 [-] executed    ajustarhora
2011-10-14 11:23:24-0300 [-] executed    service_to_manual
2011-10-14 11:23:24-0300 [-] executed    service_to_manual
2011-10-14 11:23:24-0300 [-] executed    ajustarhora
2011-10-14 11:23:25-0300 [-] executed    ajustarhora
2011-10-14 11:23:26-0300 [-] starting to sleep ... zZzZz ...
2011-10-14 11:23:36-0300 [-] Whoops!, now i woke up!

Ahora bien, si uso o bien el metodo toThread o bien decoro la funcion
blocking_task, no me bloquea
el resto de las tareas que estan 'loopeando':

2011-10-14 11:31:58-0300 [-] starting to sleep ... zZzZz ...
2011-10-14 11:31:59-0300 [-] executed    ajustarhora
2011-10-14 11:32:00-0300 [-] executed    ajustarhora
2011-10-14 11:32:01-0300 [-] executed    ajustarhora
2011-10-14 11:32:02-0300 [-] executed    ajustarhora
2011-10-14 11:32:03-0300 [-] executed    ajustarhora
2011-10-14 11:32:03-0300 [-] starting to sleep ... zZzZz ...
2011-10-14 11:32:03-0300 [-] executed    deferToThread
2011-10-14 11:32:04-0300 [-] executed    ajustarhora
2011-10-14 11:32:05-0300 [-] executed    ajustarhora
2011-10-14 11:32:06-0300 [-] executed    service_to_manual
2011-10-14 11:32:06-0300 [-] executed    ajustarhora
2011-10-14 11:32:07-0300 [-] executed    ajustarhora
2011-10-14 11:32:08-0300 [-] executed    ajustarhora
2011-10-14 11:32:08-0300 [-] Whoops!, now i woke up!
2011-10-14 11:32:09-0300 [-] executed    ajustarhora
2011-10-14 11:32:09-0300 [-] executed    deferToThread
2011-10-14 11:32:09-0300 [-] starting to sleep ... zZzZz ...

Mis preguntas son:
1) Puedo lograr el mismo efecto que 'deferToThread' pero usando solo
Deferreds ? si es asi, en que estoy
metiendo la pata ?
2) Me surge la duda de que si los threads en Python son 'secuenciales' por
el bloqueador GIL de python,
como funciona pues entonces esto de que al usar deferToThread el sleep(10)
de la tarea parece 'mandarse'
en 'background' no bloqueandome el resto de las tareas y no asi usando los
deferreds ? (posiblemente porque
los este usando mal?) Me refiero a que da la "sensacion" (que palabra esta
:P) de que se ejecutan en paralelo
con deferToThread, como es este tema ?
3) Tengo de oido que usar threads es una mala idea, esto es asi con
deferToThread?
4) {orque existen los threads en Python, en el caso de que se ejecuten
secuencialmente uno luego del otro por esto del GIL ?

Muchas gracias de antemano,
Saludos,

-- 
日本語勉強する
https://bitbucket.org/edvm
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20111014/6fea7f56/attachment.html>


More information about the pyar mailing list