Арифметика для подстановочных знаков потоков в определении правила

В моем рабочем процессе у меня есть две многопоточные программы, которые я объединяю. См. определение правила из моего файла Snakemake ниже.

rule do_the_thing:
    input: 'input.dat'
    output: 'output.dat'
    threads: 16
    shell: 'cmd1 --threads {threads} {input} | cmd2 --threads {threads} > {output}'

Как написано, команда будет потреблять 32 потока. Есть ли способ выполнять арифметические операции с переменной потоков, чтобы (например) каждая команда потребляла только половину доступных потоков?


person Daniel Standage    schedule 30.10.2018    source источник
comment
Возможно, установите threads на требуемое количество и выполните математику в вашей команде оболочки?   -  person Manavalan Gajapathy    schedule 30.10.2018
comment
@JeeYem Да, хотя мне нужно было бы использовать функцию потолка, чтобы убедиться, что я не назначаю 0 потоков. Что выполнимо, но грязно. Может быть чище реализовать правило с использованием кода Python и подпроцесса.   -  person Daniel Standage    schedule 30.10.2018
comment
Если вы найдете чистый подход, опубликуйте его. Кажется, должен быть простой способ сделать это на стороне python, но я не могу понять. Кажется, мы всегда проходим через какое-то преобразование файлов, фильтр или сортировку...   -  person travc    schedule 27.06.2019
comment
@travc, может быть, один из предложенных мной вариантов может помочь?   -  person Maarten-vd-Sande    schedule 08.09.2019


Ответы (1)


Вариантов довольно много:

shell: 
    cpulimit --include-children -l {threads}00 --\
    cmd1 --threads {threads} {input} | cmd2 --threads {threads} > {output}
  • рассчитать использование потока в параметрах:
threads: 16
params: lambda threads: max(1, threads//2)
shell: 
    cmd1 --threads {params.threads} {input} | cmd2 --threads {params.threads} > {output}
rule do_the_thing_first:
    output: pipe('output.pipe')
    threads: 8
    shell: 'cmd1 --threads {threads} {input} > {output}'

rule do_the_thing_second:
    input: 'output.pipe'
    output: 'output.dat'
    threads: 8
    shell: 'cmd2 --threads {threads} > {output}'
person Maarten-vd-Sande    schedule 07.09.2019