【发布时间】:2014-01-21 07:59:43
【问题描述】:
我正在从一个 tcl 脚本生成多个 sh (sipp) 脚本。我想知道这些脚本将并行运行还是作为子进程运行?因为我想并行运行。
如果我使用线程扩展,那么我是否需要同时使用任何其他包?
提前致谢。
【问题讨论】:
-
哪个操作系统??对于线程,您需要安装启用线程的 TCL
标签: multithreading parallel-processing tcl spawn
我正在从一个 tcl 脚本生成多个 sh (sipp) 脚本。我想知道这些脚本将并行运行还是作为子进程运行?因为我想并行运行。
如果我使用线程扩展,那么我是否需要同时使用任何其他包?
提前致谢。
【问题讨论】:
标签: multithreading parallel-processing tcl spawn
Tcl 可以很容易地并行运行多个子进程。您这样做的方式取决于您希望如何处理这些子流程的工作。 (Bourne shell — sh — 脚本作为子进程工作得很好。)这些都不需要线程。你也可以使用线程,但至少从 Tcl 的角度来看,它们不是仅仅运行子进程所必需的, 子进程处理是一个纯粹的 I/O 绑定的事情。
有关更多详细信息,请缩小(在另一个问题中)您要执行哪种类型的子流程处理。
如果您根本不关心跟踪子进程,只需将& 作为最后一个字放在exec 中,将它们设置为后台运行:
exec /bin/sh myscript.sh &
要与子流程保持联系,您需要 open 一个管道(并使用这个奇怪的节来这样做;将参数放在一个列表中,并在前面连接一个 |):
set thePipe [open |[list /bin/sh myscript.sh]]
然后您可以从管道中read/gets 获取输出(是的,它支持fileevent 和所有平台上的异步 I/O)。如果您想写入以w 模式打开的管道(即,子进程的标准输入),并且要读取和写入,请使用r+ 或w+ 模式(没关系,因为它是管道而不是文件)。请注意,您必须小心使用管道;你可能会陷入僵局或高度困惑。我建议使用异步 I/O 风格,使用 fconfigure $thePipe -blocking 0,但这与同步风格的 I/O 处理有很大不同。
您还可以使用 Expect 扩展程序同时处理多个衍生的子进程。为此,您必须将每个 spawn 的 id 保存在其自己的变量中,然后使用 -i 选项将该 id 传递给 expect 和 send。你可能想使用expect_background。
set theId [spawn /bin/sh myscript.sh]
expect_background {
-i $theId
"password:" {
send -i $theId "$mypass\r"
# Etc.
}
}
# Note that [expect_background] doesn't support 'timeout'
【讨论】: