Recurso compartido ==Contención
Escribir en un archivo normal por definición es una operación serializada. No obtiene rendimiento al intentar escribir en él desde varios subprocesos, la E/S es un recurso limitado finito en órdenes de magnitud menos ancho de banda que incluso la CPU más lenta o más sobrecargada.
El acceso simultáneo a un recurso compartido puede ser complicado (y lento)
Si tiene varios subprocesos que están haciendo cálculos costosos, entonces tiene opciones, si solo está usando varios subprocesos porque cree que va a acelerar algo, simplemente hará lo contrario. La contención de E/S siempre ralentiza el acceso al recurso, nunca lo acelera debido a las esperas de bloqueo y otros gastos generales.
Debe tener una sección crítica que esté protegida y permita solo un escritor a la vez. Simplemente busque el código fuente de cualquier escritor de registro que admita la concurrencia y verá que solo hay un único subproceso que escribe en el archivo.
Si su aplicación es principalmente:
-
Uso de CPU: Puede usar algún mecanismo de bloqueo/construcción de datos para permitir que solo un subproceso de muchos escriba en el archivo a la vez, lo que será inútil desde el punto de vista de la concurrencia como una solución ingenua; Si estos subprocesos están vinculados a la CPU con poca E/S, esto podría funcionar.
-
Límite de E/S: Este es el caso más común, debe usar un sistema de transmisión de mensajes con una cola de algún tipo y hacer que todos los subprocesos se publiquen en una cola/búfer y que un solo subproceso extraiga de él y escriba en el archivo. Esta será la solución más escalable y fácil de implementar.
Diario - Escrituras asíncronas
Si necesita crear un solo archivo súper grande donde el orden de las escrituras no es importante y el programa está vinculado a la CPU, puede usar una técnica de registro en diario.
Tener cada process
escriba en un archivo separado y luego concatene los múltiples archivos en un solo archivo grande al final. Esta es una baja tecnología de la vieja escuela solución que funciona bien y lo ha hecho durante décadas.
Obviamente, cuantas más E/S de almacenamiento tenga, mejor funcionará al final de la concatenación.