如何使用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线程作为进程间通信方式?的主要内容,如果未能解决你的问题,请参考以下文章