Получить количество подходящих шаблонов из подгруппы

У меня возникла проблема в том, что я хотел завершить многопроцессорный подпроцесс, если потребовалось больше времени, чем заданная длина таймаута. Я хотел установить тайм-аут в Popen(), но это не сработало. Затем я понял, что Popen().wait() равен call(), и поэтому у меня возникла идея установить тайм-аут в рамках метода .wait(timeout=xxx), который, наконец, работал. Таким образом, я решил это так:

import os
import sys
import signal
import subprocess
from multiprocessing import Pool

cores_for_parallelization = 4
timeout_time = 15  # seconds

def main():
    jobs = [...YOUR_JOB_LIST...]
    with Pool(cores_for_parallelization) as p:
        p.map(run_parallel_jobs, jobs)

def run_parallel_jobs(args):
    # Define the arguments including the paths
    initial_terminal_command = 'C:\\Python34\\python.exe'  # Python executable
    function_to_start = 'C:\\temp\\xyz.py'  # The multithreading script
    final_list = [initial_terminal_command, function_to_start]
    final_list.extend(args)

    # Start the subprocess and determine the process PID
    subp = subprocess.Popen(final_list)  # starts the process
    pid = subp.pid

    # Wait until the return code returns from the function by considering the timeout. 
    # If not, terminate the process.
    try:
        returncode = subp.wait(timeout=timeout_time)  # should be zero if accomplished
    except subprocess.TimeoutExpired:
        # Distinguish between Linux and Windows and terminate the process if 
        # the timeout has been expired
        if sys.platform == 'linux2':
            os.kill(pid, signal.SIGTERM)
        elif sys.platform == 'win32':
            subp.terminate()

if __name__ == '__main__':
    main()
0
задан monk 15 January 2019 в 23:07
поделиться

3 ответа

С GNU awk для истинных многомерных массивов (и при условии, что между именем приложения и : всегда есть пробел):

$ awk -v OFS=':' '
    { cnt[$4][$5]++ }
    END {
        for (node in cnt) {
            print node, ""
            for (app in cnt[node]) {
                print app, cnt[node][app]
            }
            print ""
        }
    }
' file
node2:
app1:1
app4:1

node1:
app1:1
app2:3
app3:1
app4:2

, если порядок вывода является проблемой, тогда уточните ваши требования в Ваш вопрос, так как есть различные способы упорядочить вывод.

0
ответ дан Ed Morton 15 January 2019 в 23:07
поделиться

Вот отсортированная выходная версия gawk:

awk '{a[$4][$5]++} 
     END{PROCINFO["sorted_in"] = "@ind_str_asc"
     for (e in a) {
        printf "%s:\n", e
        for (x in a[e]) 
            printf "\t%s %s\n", x, a[e][x]}}' file
node1:
    app1: 1
    app2: 3
    app3: 1
    app4: 2
node2:
    app1: 1
    app4: 1
0
ответ дан dawg 15 January 2019 в 23:07
поделиться

сортировать с помощью awk

$ cat monk.txt
Jan  2 13:01:02 node1  app1: Some message I do not care2.
Jan  2 13:01:02 node1  app2: Some message I do not care13.
Jan  2 13:01:02 node1  app3: Some message I do not care9.
Jan  2 13:01:02 node1  app4: Some message I do not care4.
Jan  2 13:01:02 node2  app4: Some message I do not care11.
Jan  2 13:01:02 node1  app4: Some message I do not care8.
Jan  2 13:01:02 node1  app2: Some message I do not care10.
Jan  2 13:01:02 node2  app1: Some message I do not care5.
Jan  2 13:01:02 node1  app2: Some message I do not care3.
$ sort -k4 -k5 monk.txt | awk -F"[ :]" ' { c=$7;if(p!=c && NR>1){print p;for(i in a) print "\t" i,":",a[i];delete a }p=c;a[$9]++} END{ print p;for(i in a)print "\t" i,":",a[i]; } '
node1
        app1 : 1
        app2 : 3
        app3 : 1
        app4 : 2
node2
        app1 : 1
        app4 : 1
$

или обернуть общий код печати в функцию

$ cat test.awk
function f1()
{
print p;
for(i in a) print "\t" i,":",a[i];
delete a
}
{ c=$7; if(p!=c && NR>1) { f1() } p=c;a[$9]++ }
END{ f1() }
$ sort -k4 -k5 monk.txt | gawk -F"[ :]" -f test.awk
node1
        app1 : 1
        app2 : 3
        app3 : 1
        app4 : 2
node2
        app1 : 1
        app4 : 1
$
0
ответ дан stack0114106 15 January 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: