Hace 9 años | Por --171278--
Publicado hace 9 años por --171278--

Buenas ver si podéis ayudarme. Tengo un programa donde pueden participar N personas realizando tareas repitiendo estás tareas durante una cantidad de rondas. Cada una lo hace en paralelo.

Lo que busco es que al final de cada ronda, se escriba en un fichero los datos de los resultados de ea tarea de todos los participantes.

El problema es eso que se ejecuten paralelo y no hay ningún proceso central que los coordine. Bueno , pueden guardar datos en memoria que todos comparten

¿Qué pensáis que puedo hacer?

EDITADO :SOLUCIONADO

Comentarios

gallir

Tienes que asegurar exclusión mutua (https://gallir.wordpress.com/2015/02/17/principios-de-concurrencia-exclusion-mutua/#_exclusión_mutua), o bien los los "locks" de fichero o desde el programa. Si usas mutex (no sé el lenguaje) es:

mutex.Lock();
hacer_el_seek_en_fichero();
escribir();
mutex.Unlock();

D

#2 Gracias lo iraré, el lenguaje es en python jejeje...

D

#2 Leído y como con el framework que estoy no puedo usar eso. Podría programarlo yo pero meterme en el framework puede llevarme demasiado he leído tu blog y he seguido la técnica de la panadería.

Bueno conforme acaban voy poniendoles en una array que comparten, inmediatamente después cada uno comprueba si el array ya tiene a todos los participantes. Esto solo ocurrirá cuando el último acabe y se añada. Cuandoestopase pues escriben el fichero.

Seguro que es muy cutre esta solución pero funciona de momento jeje.

gallir

#5 ¿Que no puedes usar https://docs.python.org/2/library/mutex.html ?

No lo creo.

D

#6 uhmmm puede ser...pero ya te digo que por falta de tiempo ...ya lo probaré cuando esté más ddesahogado...de momento el otro apaño vaa '-_-

e

#7 Pero si no sincronizas los threads de ninguna forma en algún caso (muy excepcional) en el que dos se intentasen añadir a un array al mismo tiempo, se añadirían en la misma posición, sobreescribiéndose. Al menos en lenguajes de bajo nivel, no sé si el python tendrá una operación de añadir a un array que sea threadsafe.

e

#6 ¿Y si cada usuario ejecutase su tarea en un proceso distinto? (ni idea de cómo compartirían memoria en python pero imposible no será). ¿Cumpliría su función el mutex en ese caso?

e

#10 Entonces tienes razón, es lo que hay que usar.

kikuyo

#0 No sé si acabo de entender el planteamiento, pero me tiro al monte:

Entiendo dos procesos separados:

1) El participante X (en paralelo con los otros) realiza una tarea y la termina, o no... (aquí el algoritmo que haga lo que tenga que hacer con la tarea, desde servirla, controlar el tiempo y la respuesta, grabarlas en ficheros independientes, etc.

Y cuando finaliza la ronda (por tiempo, culminación de todas las tareas, etc.)

2) Se cierran las tareas que queden abiertas y se procede a la lectura de todas las tareas y su integración en el fichero único (luego se destruyen los ficheros de las tareas individuales)

D

#1 Gracias por responder.

Todas las tareas se acaban.

Tenia en mente buscar alguna manera de quienes es el último en acabar. Tal vez usando la memoria que todos comparten. Y entonces el último puede escribir en un fichero los registros de esa ronda.

Pero no se