【问题标题】:Spawning multiple sh scripts in tcl makes it parallel process or child process?在 tcl 中生成多个 sh 脚本使其成为并行进程或子进程?
【发布时间】:2014-01-21 07:59:43
【问题描述】:

我正在从一个 tcl 脚本生成多个 sh (sipp) 脚本。我想知道这些脚本将并行运行还是作为子进程运行?因为我想并行运行。

如果我使用线程扩展,那么我是否需要同时使用任何其他包?

提前致谢。

【问题讨论】:

  • 哪个操作系统??对于线程,您需要安装启用线程的 TCL

标签: multithreading parallel-processing tcl spawn


【解决方案1】:

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 传递给 expectsend。你可能想使用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'

【讨论】:

  • 感谢您的回答。我已经在使用 Expect。我正在使用 expect 包来停止我正在运行的那些 sipp 脚本。但是我有点困惑,当我一个接一个地点击多个脚本并将它们的生成 id 保存在不同的变量中时,那么这些脚本是否并行运行。根据你的回答,它们是并行运行的,对吧?
  • @Abhi Expect 可以并行运行它们,是的。默认情况下,它并没有真正这样做(有用),因为默认 ID 确实存储在全局变量中。请注意,虚拟终端的数量存在全局(跨系统上的所有进程)限制,这是预期用来实现事物的。
  • 是的,我在运行每个脚本后将值保存在全局变量中的某个变量中。它并行运行多个脚本,但在终端中仅显示一个脚本的执行。这让我有点怀疑它是否在并行运行多个脚本。感谢您的帮助,我得到了主要问题的答案。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-06-22
相关资源
最近更新 更多