如何使用tcl线程作为进程间通信方法?

时间:2015-09-07 07:18:19

标签: multithreading tcl ipc

我正在尝试搜索信息,如果tcl线程可能发生进程间通信。我对这个话题很认真,所以现在只收集信息。我理解发送器和接收器机制被编码以在进程之间传递数据。而tcl thread包提供send命令。另外线程可以用作同一内部的spawn进程的计时器。 是否有可能从线程接收数据到另一个线程? 感谢你。

#contains of test.tcl
puts stdout "hello from wish"
# end of file

# set cmd
set exe {wish85.exe}

set exepath [list $exe test.tcl]

# This next line is slightly magical
set f [open |$exepath r+]
# Use the next line or you'll regret it!
puts $f {fconfigure stdout -buffering line}

fileevent $f readable "getline $f"
proc getline f {

       if {[gets $f line]<0} {

           close $f ;
           return ;
        }
puts "line=$line"
} 

1 个答案:

答案 0 :(得分:2)

你需要更清楚地了解你在寻找什么。线程不是进程!使用Tcl,每个Tcl解释器上下文(您创建命令和变量的内容)都绑定到一个线程,并且每个线程都耦合到一个进程。

Tcl有一个用于管理线程的Thread包(它应该附带任何适当的Tcl 8.6分发),并提供一种在线程thread::send之间发送消息的机制。那些消息?它们是可执行脚本,这意味着它们真的灵活。

对于进程之间的通信,事情是很多更复杂,因为您必须同时考虑其他进程的发现和安全性(因为进程是设计的安全边界)。以下是一些选项:

  • Tcl非常擅长运行子进程并通过管道与它们交谈。例如,您可以使用open

    在几行中运行从属解释器
    # This next line is slightly magical
    set mypipeline [open |[list [info nameofexecutable]] r+]
    
    # Use the next line or you'll regret it!
    puts $mypipeline {fconfigure stdout -buffering line}
    

    它甚至可以与fileevent命令一起使用,因此您可以在每个解释器中进行异步处理。 (这在语言运行时非常罕见,唉。)

  • Tk中的send命令允许您使用相同的显示将脚本发送到其他进程(我不确定这是否适用于Windows),就像thread::send中的线程一样。同样的过程。

  • Tcllib中的comm包做了类似的事情,但使用通用套接字作为通信结构。

  • 在Windows上,您可以使用Tcl中的dde命令与其他进程通信。我不认为默认情况下Tcl会注册一个DDE服务器,但它很容易做到(前提是你正在运行事件循环,但这是大多数IPC机制工作的常见要求)。

更一般地说,您可以考虑运行Web服务等等,但这变得非常复杂!