Tcl parallel exec命令如何运行

Tcl parallel exec命令如何运行,tcl,Tcl,我有这个脚本,希望并行运行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} { set results [exec sh search

我有这个脚本,希望并行运行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} {
    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
[24.02.20/22:00:59]结果:/home/test/name1
[24.02.20/22:01:34]结果:/home/test/name2
[24.02.20/22:03:05]结果:/home/test/name3
[24.02.20/22:09:05]结果:/home/test/name4
[24.02.20/22:09:07]结果:/home/test/name5
请参见

如果最后一个参数是
&
,则管道将在后台执行。在这种情况下,exec命令将返回一个列表,其元素是管道中所有子流程的流程标识符。管道中最后一个命令的标准输出将转到应用程序的标准输出(如果未重定向),管道中所有命令的错误输出将转到应用程序的标准错误文件(除非重定向)

如果最后一个参数是
&
,则管道将在后台执行。在这种情况下,exec命令将返回一个列表,其元素是管道中所有子流程的流程标识符。管道中最后一个命令的标准输出将转到应用程序的标准输出(如果未重定向),管道中所有命令的错误输出将转到应用程序的标准错误文件(除非重定向)


要在后台运行命令并捕获结果,需要打开管道并异步运行。(如果
&
是其最终参数,则
exec
命令可以在后台运行,但在捕获结果时不能运行。)


请注意,这将并行启动所有搜索。这可能会使您的系统负载增加很多!这也可能以任意顺序交付结果。按顺序操作是可能的,但需要更复杂的代码和手动继续传递,或者协同路由(Tcl 8.6或更高版本)。或者,您可以将按顺序执行的操作交给子流程:这很简单。

要在后台运行命令并捕获结果,您需要打开管道并异步运行。(如果
&
是其最终参数,则
exec
命令可以在后台运行,但在捕获结果时不能运行。)


请注意,这将并行启动所有搜索。这可能会使您的系统负载增加很多!这也可能以任意顺序交付结果。按顺序操作是可能的,但需要更复杂的代码和手动继续传递,或者协同路由(Tcl 8.6或更高版本)。或者,您可以将按顺序进行的操作交给子流程:这很简单。

如果它在变量中,这又会发生什么呢?set results[exec sh search.sh$release$site]&Tcl error:error#args:应该是“set varName?newValue?”注意参数位置:
&
意味着终止嵌套命令:
set results[exec…&]
。set results[exec sh search.sh$name$search&]其错误:Tcl error:keyAs Donal说,缺少值,您无法捕获后台执行器的输出,因此我的建议是错误的方法。如果它在变量中,这将转到何处?set results[exec sh search.sh$release$site]&Tcl error:error#args:应该是“set varName?newValue?”注意参数位置:
&
意味着终止嵌套命令:
set results[exec…&]
。set results[exec sh search.sh$name$search&]其错误:Tcl error:keyAs Donal说,缺少值,您无法捕获后台执行器的输出,因此我的建议是错误的方法。我有以下错误:Tcl错误:错误选项“可读”:应该是-blocking、-buffering、-buffersize、-encoding、-eofchar或-translationA-typo之一,由Donal编写。将
fconfigure
更改为
fileevent
\n我仍然在Partyline上收到大约50次错误:虚假消息!Donal Fellows你有什么办法来预测错误虚假信息!?我有一个错误:Tcl错误:错误选项“可读”:应该是-blocking、-buffering、-buffersize、-encoding、-eofchar或-translationA-typo中的一个,由Donal编写。将
fconfigure
更改为
fileevent
\n我仍然在Partyline上收到大约50次错误:虚假消息!Donal Fellows你有什么办法来预测错误虚假信息!?
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"
}