Utilice Shell para implementar tareas de ejecución multiproceso en sistemas Linux (ejecución simultánea de múltiples tareas) 2022-05-30
Recientemente, hay un lote de tareas que requieren fusionar dos lotes de fastq y comprimirlos en un archivo fastq antes de continuar. Debido al espacio de almacenamiento limitado, no podemos ejecutarlos todos directamente, por lo que solo podemos. divídalos uno por uno según el lote de muestras. Como todos sabemos, generalmente fastq existe en pares, y read1 y read2 deben fusionarse una vez respectivamente. Sin embargo, el archivo fastq de esta tarea es relativamente grande. Se necesita aproximadamente 1 día para fusionarse y comprimirse una vez, y tomará 2. -3 días para un conjunto de fastq, esto requiere demasiado tiempo, por lo que me pregunto si read1 y read2 se pueden ejecutar al mismo tiempo, lo que puede ahorrar la mitad del tiempo.
Por lo general, nos encontramos con muchas tareas similares, especialmente cuando la cantidad de procesos es limitada. Si estas pequeñas tareas ocupan un solo proceso y hay muchas tareas, llevará mucho tiempo. hecho en un solo proceso, la implementación de múltiples subprocesos para la ejecución en paralelo puede mejorar en gran medida la eficiencia operativa. Para obtener conocimientos sobre procesos y subprocesos, puede consultar este artículo en Zhihu: Shell "Multi-threading" para mejorar la eficiencia del trabajo. También está organizado de una manera más ordenada y más fácil de entender.
Por supuesto, algunos blogueros también han escrito artículos similares, como este límite de fondo de shell que controla la intensidad de la tarea en segundo plano para la copia de archivos, pero es demasiado inescrutable e incomprensible, tomó un tiempo. No lo aprenderé en un tiempo. Este artículo demostrará una versión simple de subprocesos múltiples de Shell, pero no tiene por qué ser demasiado complicado.
De hecho, solo requiere dos pasos. El primer paso es agregar "amp;" al final de la línea de comando que debe ejecutarse en paralelo, lo que significa ejecutarlo en segundo plano. El segundo paso es ejecutar todas las tareas paralelas en segundo plano. Agregar la frase "esperar" después significa esperar a que todas las tareas puestas en segundo plano a través de "amp;" terminen de ejecutarse antes de continuar con la ejecución de tareas posteriores. todas las líneas con "amp;" se ejecutarán en paralelo.
Después de leer el guión, ¿crees que es muy sencillo?
El script anterior es adecuado para aquellos con pocas tareas paralelas. Puede agregar amp manualmente y esperar, pero será más problemático si hay docenas o incluso cientos de tareas pequeñas. Pero no te preocupes, puedes escribir un bucle y ejecutarlo por lotes.
El resultado del bucle es similar al anterior, excepto que hay una estructura de bucle adicional.
Si la tarea que hay que realizar es de solo una línea, puedes eliminar las llaves.
En cuanto a los bucles for y while, puedes ver el artículo anterior Ejemplos de bucles comunes de Shell (procesamiento por lotes for y while) 2022-05-25
Cabe señalar que los bucles multi- El paralelismo de subprocesos todavía es necesario. Después de todo, todos se ejecutan en un proceso. Si hay demasiados subprocesos, se recomienda controlarlos dentro de 100. Por supuesto, existen métodos avanzados y complejos para lograrlo. límites. Como el script anterior es suficiente para mí, no quiero seguir aprendiendo más en el futuro.