Nextflow 소개: 채널

5066 단어 nextflowgroovy
En el artículoanterior vimos los conceptos básicos de Nextflow(프로세스, 채널 y 워크플로). En este, vamos a profundizar un poco más en el concepto de canales(채널)

El Channel es el medio por el que "hacemos llegar"datos a los processos.

Existen multiples formas de crear un canal. 알구노스 에젬플로스:

ch1 = Channel.create()
ch1 << 1
ch1 << 'hola'

ch2 = Channel.of( 1, 3, 5, 7 )

ch3 = Channel.fromPath( '/data/some/*.txt' )

ch4 = Channel.watchPath( '/path/*.fa' )


y el canal irá emitiendo los elementos disponibles según se vayan consumiendo (es decir, el canal es una cola no bloqueante que conecta consumidores)

정보

채널value에 존재하는 También siempre el mismo valor y que puede ser leído mútiples veces. 예를 들어 chn = Channel.value('hi')crea un canal que siempre emitirá el stringhi cuando se lea de él.

운영자



Los canales disponen de un conjunto de operatores (extensibles, puedes añadir los tuyos mediante el mecanismo de plugins que hablaremos en otro post) que permiten modificar los valores emitidos por estos (por ejemplo, un canal emite todos los ficheros de un directorio pero queremos filtrar) por un criteria diferente al nombre)

Algunos de los operatores disponibles:
  • filter (filter por una expresion regular o por una logica tuya, por ejemplo channel.of(1,2,3).filter{ it % 2 == 1 }.view()
  • 독특한
  • 처음, 마지막
  • 까지
  • 지도
  • 모으다
  • 정렬된 목록으로
  • … (https://www.nextflow.io/docs/latest/operator.html# )

  • 예엠플로



    Como caso "práctico"vamos a crear un pipeline que descargue un CSV del Ayuntamiento de Madrid, filtre algunos registros y los muestre

    El csv en concreto es la relacion de crashes de trafico ocurridos durante el último año, donde se especifican, entre otros, el distrito y si hubo rastros de alcohol (campos 6 y 17receivivamente) y el tipo de crashe (campo 7)

    La página del catálogo de datos

    parsecsv.nf

    workflow {
    
      Channel.fromPath( "https://datos.madrid.es/egob/catalogo/300228-24-accidentes-trafico-detalle.csv" )
    
        | splitCsv(sep:';')
    
        | filter{ row ->
            // distrito && alchohol
            row[6] == 'MORATALAZ' && row[17] == 'S'
        }
    
        | map { row ->
            // tipo
            row[7]
        }
    
        | view
    }
    


    Si ejecutas este pipeline obtendras algo como:

    nextflow run ./parsecsv.nf
    N E X T F L O W ~ version 22.04.5
    Launching `./parsecsv.nf` [shrivelled_meninsky] DSL2 - revision: 93c84a05a0
    Atropello a persona
    Vuelco
    Colisión múltiple
    Colisión múltiple
    Choque contra obstáculo fijo
    Vuelco
    Choque contra obstáculo fijo
    Choque contra obstáculo fijo
    Colisión fronto-lateral
    Alcance
    Choque contra obstáculo fijo
    Vuelco
    Colisión fronto-lateral
    Alcance
    Choque contra obstáculo fijo
    Vuelco
    Choque contra obstáculo fijo
    Choque contra obstáculo fijo
    Choque contra obstáculo fijo
    



    경고

    la utilidad real de los canales, y en realidad de Nextflow, va mucho más allá de este ejemplo pero creo que estos pequeños
    ejercicios nos sirven para ir aproximandonos al lenguaje e ir intuyendo su potencial

    정보

    Como puedes observar el DSL permite concatenar operatores mediante el uso del pipe "|"

  • Al ejecutar este pipeline, Nextflow creará un canal (anónimo) que emitirá un elemento path (Nextflow es capaz de manejar URLs como
    si fueran ficheros locales, como en este caso)

  • Este path será consumido por el operator splitCSV el cual a su ve emitirá las líneas del CSV parseadas como una lista

  • Cada línea será filtrada por la ejecución de una closure que devolverá true o false para indicar si el elemento tiene que ser emitido o no

  • El operator map recibe una lista de elementos (por cada linea filtrada) y emite un sólo campo de esta lista

  • Por último usamos un operator view que simplemente muestra por consola lo que lee por su canal



  • 결론



    우리는 파이프라인을 통해 새로운 파이프라인을 만들 수 있습니다. Su naturaleza asíncrona y capacidad de paralelizar el envío de los mensajes nos ofrecen una potencia para realizar tareas complejas muy interesante.

    좋은 웹페이지 즐겨찾기