Python múltiples hilos accediendo al mismo archivo

Tengo dos hilos, uno que escribe en un archivo y otro que mueve el archivo periódicamente a una ubicación diferente. Las escrituras siempre llamadas open antes de escribir un mensaje, y las llamadas se close después de escribir el mensaje. El motor usa shutil.move para hacer el movimiento.

Veo que después de que se realiza el primer movimiento, el escritor ya no puede escribir en el archivo, es decir, el tamaño del archivo siempre es 0 después del primer movimiento. ¿Estoy haciendo algo mal?

El locking es una solución posible, pero prefiero la architecture general de tener cada recurso externo (incluido un archivo) tratado por un solo hilo, separado. Otros subprocesos envían solicitudes de trabajo al subproceso dedicado en una instancia de Queue.Queue (y proporcionan una cola separada propia como parte de los parámetros de la solicitud de trabajo si necesitan un resultado), el subproceso dedicado pasa la mayor parte de su tiempo esperando a .get en esa cola y cada vez que recibe una solicitud se enciende y se ejecuta (y, si es necesario, devuelve los resultados en la cola pasada).

He proporcionado ejemplos detallados de este enfoque, por ejemplo, en “Python in a Nutshell”. La cola de Python es intrínsecamente segura para subprocesos y simplifica enormemente tu vida.

Una de las ventajas de esta architecture es que se traduce sin problemas al multiprocesamiento si y cuando decide cambiar algún trabajo a un proceso separado en lugar de a un subproceso separado (por ejemplo, para aprovechar los múltiples núcleos), el multiprocessing proporciona su propio tipo de Queue para hacer una transición tan suave como la seda ;-).

Cuando dos hilos acceden a los mismos recursos, suceden cosas extrañas. Para evitar eso, siempre bloquea el recurso. Python tiene el threading.Lock conveniente. Para eso, así como algunas otras herramientas (consulte la documentación del módulo de threading ).

Visite http://www.evanfosmark.com/2009/01/cross-platform-file-locking-support-in-python/

Puede usar un simple locking con su código, como lo escribió Evan Fosmark en una pregunta anterior de StackOverflow:

 from filelock import FileLock with FileLock("myfile.txt"): # work with the file as it is now locked print("Lock acquired.") 

Una de las bibliotecas más elegantes que he visto.