1

I am trying to carry out two process in parallel. Help me in writing a code in tcl which carries out two processes synchronously in TCL.

4

1 回答 1

2

在 Tcl 中,有两种方法可以“同时”运行一对子进程。

最简单:没有控制

如果您只想一次启动两个进程而不对其进行任何控制,请将 & 号 ( &) 作为最后一个参数exec

exec process1 "foo.txt" &
exec process2 "bar.txt" &

请注意,除了进程 ID(由 返回exec)之外,您根本无法控制这些子进程。一旦你设置它们,你基本上就再也不会收到它们的消息了(使用适当的重定向到/从标准输入/输出可能是可取的!)

更复杂:控制

要在后台运行子进程时保持对子进程的控制,请使其在使用open. 这样做的语法很奇怪。一定要严格遵守除了下面提到的):

set pipelineChannel1 [open |[list process1 "foo.txt" ] "r"]
set pipelineChannel2 [open |[list process2 "bar.txt" ] "r"]

这些是读取器管道,您可以在其中使用子流程的输出;这就是(可选)的r意思。要获得您写入的管道(即您提供输入的管道),请w改用,如果您想同时读取和写入,请使用r+. 然后,管道只是您与putsgetsreadfconfigure等一起使用的普通通道。就close在您完成时。

|必须在外面并且紧接在之前[list …]。如果命令的名称(可能是完整的路径名)中包含任何 Tcl 元字符,这一点尤其重要,这是因为规范说明了open这一点:

如果文件名的第一个字符“<strong>|” 然后fileName的其余字符被视为描述要调用的命令管道的参数列表,其样式与exec的参数相同。

使用管道时要注意的主要事项是。

  • 子流程的处理实际上是异步的。您需要注意避免一次强制过多的输出,尽管打开非阻塞 IOfconfigure $channel -blocking 0通常就足够了。
  • 其他进程在输出到管道时可以(并且经常这样做)以不同的方式缓冲它们的输出,而不是在它们写入终端时。如果这是一个问题,您将不得不考虑是否使用像 Expect 这样的包(它也可以一次运行多个交互,尽管应该更谨慎地使用它,因为虚拟终端比虚拟终端更昂贵且系统资源有限管道)。

如果您正在与子进程进行真正复杂的异步交互,请考虑使用 Tcl 8.6,其中有构建在基本协程功能之上的 Tcllib 包,可以更轻松地跟踪正在发生的事情。

于 2013-06-30T11:39:01.300 回答