Re: [Python-es] ¿queue.put bloquea?
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
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
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/
