Re: [Python-es] ¿queue.put bloquea?

2014-01-21 Por tema Chema Cortes
El día 20 de enero de 2014, 15:23, Daπid  escribió:
>
> 2014/1/18 Chema Cortes 
>>
>> Este relato es habitual en la programación concurrente.
>>
>> Queue se utiliza para "sincronismo" entre workers. El sincronismo
>> requiere establecer bloqueos, que aumentan en número geométricamente
>> al aumentar el número de workers, haciendo el programa mucho más lento.
>>
>> Si no necesitas "sincronismo", o sea, si no necesitas que los datos se
>> encolen en el mismo orden que se generan (el orden lo podrías
>> recomponer después usando las marcas temporales), usa mejor
>> collections.deque cuyas operaciones son "atómicas" (no bloqueantes).
>> Ojo con lo que puede llegar a crecer si no eres capaz de sacar datos
>> al mismo ritmo que se meten.
>
>
>
> El orden en el que se ejecuten es completamente irrelevante. deque parece
> una opción muy buena, pero, desafortunadamente, no parece ser compatible con
> multiprocessing.

Tienes razón, con multiproceso funciona de otro modo.

La cuestión sería emplear los métodos async, algo así:

import time
from random import random

from collections import deque
from multiprocessing import Pool, freeze_support
from functools import partial

from pprint import pprint

def do_insert(i):
time.sleep(random()/10)
return (i, i*i, -i*100)

def do_callback(q, res):
q.append(res)


if __name__ == "__main__":
freeze_support()
q = deque()

mp = Pool() # núm. se autoajusta según número de cores

callback = partial(do_callback,q)
results = [ mp.apply_async(do_insert, (i,), callback=callback)
for i in range(100)]

while not all(res.ready() for res in results):
print ".",
time.sleep(0.1)

pprint(q)


En do_insert se haría el procesado de cada dato (he introducido un
retardo aleatorio para que comprobar que el orden final no depende del
orden en que se introducen los datos).

En do_callback se iría añadiendo los datos a la cola deque. Paso la
cola como argumento implícito en una función parcial. También se
podría haber usado como variable global, pero se debe evitar en
multiproceso.

El "cuello de botella" se produce al introducir los datos en la cola.
Si es necesario, se pueden incrementar el número de workers en el
pool. No hay lecturas de la cola, por lo que no se producen bloqueos
de lectura.


>
> Aquí está el esqueleto de mi programa:
>
> https://gist.github.com/Dapid/8520567
>
> Si uso deque, el proceso siempre ve la misma cola vacía. Si lo convierto en
> un Thread, puede leer los datos del programa principal, pero no  los datos
> generados desde un multiprocessing.pool.
>
> ¿Hay alguna otra alternativa?

Depende de para qué, podrías mirarte alguna implementación de
"mapreduce" a ver si te sirve para esta problema:

De más sencillo a más potente:

Octopy: http://code.google.com/p/octopy/
Mincemeat: https://github.com/michaelfairley/mincemeatpy
MrJob: http://pythonhosted.org/mrjob
Spark: http://spark.incubator.apache.org/

-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://ch3m4.org/blog
Buscador Python Hispano: http://ch3m4.org/python-es
___
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


[Python-es] Unicidad, nombres de sets, inicialización con set y búsqueda en un set de un modelo

2014-01-21 Por tema Juan Asensio Sánchez
Hola

Estoy empezando en esto del desarrollo con Django. Vengo de Java y esto es
muy distinto... Bueno, tengo estas dos clases (bueno, es más grande, pero
en resumen...):


class Host(models.Model):
slug = models.SlugField()

class HostIp(models.Model):
host = models.ForeignKey(Host)
ip = models.IPAddressField(unique=True)

Lo primero, a partir de una IP como cadena de texto (no un objeto), ¿cómo
puedo saber a qué host pertenece? He probado con
Host.objects.get(hostip_set__ip="1.2.3.4") y variantes, pero no he dado con
la tecla.

Por otro lado, ¿cómo puedo cambiar el nombre de las propiedades que son
sets? Por ejemplo, en lugar de referenciar la lista de IPs de un host como
"hostip_set", llamarlo "ips".

Otro más, ¿cómo puedo crear un objeto directamente pasando la lista de IPs?
He probado con Host.objects.create(hostip_set=[HostIp(ip="10.10.10.10")]),
pero me da error de que el host no tiene id, supongo que porque intenta
guardar las IPs antes que el host.

Aparte, y relacionado, ¿cómo puedo forzar que la lista de IPs tenga al
menos un valor?

Y por último, estoy creando hosts ahora mismo manualmente, de este modo:

host = Host.objects.create(description="Host creado de forma automática el
X")
host.hostip_set.add(HostIp(ip=remote_ip))
host.save()

Si esto lo hago varias veces con la misma IP, no me da error, cuando en la
definición del campo para la IP le he dicho que se único. ¿Alguien sabe por
qué?

Un saludo y muchas gracias por adelantado.
___
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Unicidad, nombres de sets, inicialización con set y búsqueda en un set de un modelo

2014-01-21 Por tema Diego pascual lopez
Buenas Juan,


2014/1/21 Juan Asensio Sánchez 

> Hola
>
> Estoy empezando en esto del desarrollo con Django. Vengo de Java y esto es
> muy distinto... Bueno, tengo estas dos clases (bueno, es más grande, pero
> en resumen...):
>
>
> class Host(models.Model):
> slug = models.SlugField()
>
> class HostIp(models.Model):
> host = models.ForeignKey(Host)
> ip = models.IPAddressField(unique=True)
>
> Lo primero, a partir de una IP como cadena de texto (no un objeto), ¿cómo
> puedo saber a qué host pertenece? He probado con
> Host.objects.get(hostip_set__ip="1.2.3.4") y variantes, pero no he dado con
> la tecla.
>

prueba sin el set,  Host.objects.get(hostip__ip="1.2.3.4")

>
> Por otro lado, ¿cómo puedo cambiar el nombre de las propiedades que son
> sets? Por ejemplo, en lugar de referenciar la lista de IPs de un host como
> "hostip_set", llamarlo "ips".
>

creo que buscas esto
https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ForeignKey.related_name



> Otro más, ¿cómo puedo crear un objeto directamente pasando la lista de
> IPs? He probado con
> Host.objects.create(hostip_set=[HostIp(ip="10.10.10.10")]), pero me da
> error de que el host no tiene id, supongo que porque intenta guardar las
> IPs antes que el host.
>

> Aparte, y relacionado, ¿cómo puedo forzar que la lista de IPs tenga al
> menos un valor?
>

Puedes usar post_save para añadir una al crear el host
https://docs.djangoproject.com/en/dev/ref/signals/#post-save


> Y por último, estoy creando hosts ahora mismo manualmente, de este modo:
>
> host = Host.objects.create(description="Host creado de forma automática el
> X")
> host.hostip_set.add(HostIp(ip=remote_ip))
> host.save()
>

Crea el host y luego puedes usar bulk_create
https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create


>
> Si esto lo hago varias veces con la misma IP, no me da error, cuando en la
> definición del campo para la IP le he dicho que se único. ¿Alguien sabe por
> qué?
>

Esto se me escapa

>
> Un saludo y muchas gracias por adelantado.
>
>
Un saludo.

> ___
> Python-es mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
___
Python-es mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/