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

How to use tcl thread as inter process communication method?

我正在尝试搜索有关 tcl 线程是否可以进行进程间通信的信息。我对这个话题很感兴趣,所以现在只是收集信息。我了解发送方和接收方机制将被编码以在进程之间传递数据。而tcl线程包提供了send命令。线程也可以用作内部生成过程的计时器。 是否可以从线程接收数据到另一个线程? 谢谢。

#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 机制发挥最佳作用的常见要求) .

更一般地说,您可以考虑 运行网络服务等,但这变得相当复杂!