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



我试图搜索信息,如果进程间通信可以与tcl线程发生。我对这个话题更感兴趣,所以现在只是收集信息。我理解发送方和接收方机制要编码,以便在进程之间传递数据。而tcl线程包提供了发送命令。线程也可以用作定时器的产卵过程中相同的。是否有可能从线程接收数据到另一个线程?感谢你。

#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"
} 

你需要更清楚你在寻找什么。线程不是进程!使用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服务等,但这变得相当复杂!

最新更新