Tengo un código enhebrado donde cada hilo necesita escribir en el mismo archivo. Para evitar problemas de concurrencia, estoy usando un objeto de bloqueo.Acceso a recursos multiproceso: ¿dónde pongo mis bloqueos?
Mi pregunta es si estoy usando el bloqueo correctamente. Si configuro el bloqueo dentro de cada hilo, ¿ese bloqueo es global o solo específico para ese hilo específico?
Básicamente, debería crear un bloqueo primero y pasar su referencia a cada hilo, o ¿Está bien establecido que desde el interior de la rosca como lo hago aquí:
import time
from threading import Thread, Lock
def main():
for i in range(20):
agent = Agent(i)
agent.start()
class Agent(Thread):
def __init__(self, thread_num):
Thread.__init__(self)
self.thread_num = thread_num
def run(self):
while True:
print 'hello from thread %s' % self.thread_num
self.write_result()
def write_result(self):
lock = Lock()
lock.acquire()
try:
f = open('foo.txt', 'a')
f.write('hello from thread %s\n' % self.thread_num)
f.flush()
f.close()
finally:
lock.release()
if __name__ == '__main__':
main()
Sí, lo movió fuera del método, pero aún lo está creando en el propio subproceso. ¿No es eso un problema? –
@cgoldberd: se está creando como un atributo * class *, eso significa que se creará una sola para todos los hilos. Ese es un mejor lugar para mantenerlo porque todo permanece en la clase de subprocesos. – nosklo
gotcha. Me gusta ese enfoque –