как можно параллельно запустить команду exe c - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть этот скрипт и я хочу запустить exe c параллельно. в данный момент он работает один за другим. Как мне это сделать?

Большое спасибо за вашу помощь

bind pub -|- !tt proc:tt
proc proc:tt {nick host handle channel arg} {

set search [lindex [split [stripcodes bcu $arg]] 0]

foreach name {name1 name2 name3 name4 name5} {
    set results [exec sh search.sh $name $search]
putnow "PRIVMSG $channel :results: $results"
}
}

на данный момент проблема в последовательности. но это должно быть параллельно

[24.02.20/22:00:59] <testbot> results: /home/test/name1
[24.02.20/22:01:34] <testbot> results: /home/test/name2
[24.02.20/22:03:05] <testbot> results: /home/test/name3
[24.02.20/22:09:05] <testbot> results: /home/test/name4
[24.02.20/22:09:07] <testbot> results: /home/test/name5

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Чтобы запустить команду в фоновом режиме и зафиксировать результаты, вам нужно открыть конвейер и выполнить все асинхронно. (Команда exec может запускать вещи в фоновом режиме, если & является ее последним аргументом, но не во время захвата результатов.)

bind pub -|- !tt proc:tt
proc proc:tt {nick host handle channel arg} {
    set search [lindex [split [stripcodes bcu $arg]] 0]

    foreach name {name1 name2 name3 name4 name5} {
        # Launch the subprocess
        set pipe [open |[list sh search.sh $name $search]]
        # Set up a handler for when the subprocess produces *any* output *or* finishes
        fconfigure $pipe readable [list handle:search:output $channel $pipe $name]
    }
    putnow "PRIVMSG $channel processing..."
}
proc handle:search:output {channel pipe name} {
    set line [gets $pipe]
    if {[eof $pipe]} {
        close $pipe
        putnow "PRIVMSG $channel search for $name done"
        return
    }
    putnow "PRIVMSG $channel :result($name): $line"
}

Обратите внимание, что при этом все поиски запускаются параллельно. Это может загрузить вашу систему совсем немного! Это также может привести к результатам в произвольном порядке. Выполнение операций в порядке возможно , но требует либо более сложного кода с ручной передачей продолжения, либо сопрограмм (Tcl 8.6 или новее). Или вы можете передать последовательность действий подпроцессу: это просто.

0 голосов
/ 25 февраля 2020

См. https://tcl.tk/man/tcl8.6/TclCmd/exec.htm

Если последний аргумент равен &, то конвейер будет выполняться в фоновом режиме. В этом случае команда exe c вернет список, элементы которого являются идентификаторами процесса для всех подпроцессов в конвейере. Стандартный вывод последней команды в конвейере будет go в стандартный вывод приложения, если он не был перенаправлен, а вывод ошибок из всех команд в конвейере будет go в стандартный файл ошибок приложения, если не будет перенаправлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...