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

Posted

技术标签:

【中文标题】如何使用tcl线程作为进程间通信方式?【英文标题】:How to use tcl thread as inter process communication method? 【发布时间】:2015-09-07 07:18:18 【问题描述】:

如果进程间通信可以通过 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"
 

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢...我现在明白了。一旦我准备好,就会放在这里。 执行exe没有stdout通道怎么办?

以上是关于如何使用tcl线程作为进程间通信方式?的主要内容,如果未能解决你的问题,请参考以下文章

进程间的几种通信方式的比较和线程间的几种

进程间通信和线程间通信

进程间通信和线程间通信

进程与线程的区别,进程间通信方式,线程间通信方式

进程间通信和线程间通信的几种方式

Linux - 进程间通信与线程通信方式