如何使用 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 机制发挥最佳作用的常见要求) .
更一般地说,您可以考虑 运行网络服务等,但这变得相当复杂!
我正在尝试搜索有关 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 机制发挥最佳作用的常见要求) .
更一般地说,您可以考虑 运行网络服务等,但这变得相当复杂!