如何在TCL中执行同步过程

时间:2013-06-29 13:54:31

标签: tcl tk

我正在尝试并行执行两个过程。帮助我编写tcl中的代码,该代码在TCL中同步执行两个进程。

1 个答案:

答案 0 :(得分: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 …]之前和之前。fconfigure $channel -blocking 0。这很重要,如果命令的名称(可能是完整路径名)中包含任何Tcl元字符,并且因为specification of open说明了这一点:

  

如果 fileName 的第一个字符是“ | ”,那么 fileName 的其余字符将被视为描述a的参数列表要调用的命令管道,其格式与 exec

的参数相同

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

  • 子进程的处理实际上是异步的。您需要注意尽量避免强制输出过多的输出,尽管使用{{1}}打开非阻塞IO通常就足够了。
  • 当输出到管道时,其他进程可以(并经常)缓冲输出,而不是在写入终端时。如果这是一个问题,你将不得不考虑是否使用像Expect这样的软件包(它也可以同时运行多个交互,但是由于虚拟终端比一个更加昂贵和有限的系统资源,因此应该更加谨慎地使用它。管道)。

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