我正在尝试并行运行两个程序。由于 TCL 是解释器,它会一一处理程序。有人可以用一个例子解释我如何在 TCL 中使用多线程吗?
1 回答
如今,在 Tcl 中进行多线程处理的常用方法是使用它的Thread
扩展——它与 Tcl 的核心一起开发,但在某些平台(例如各种基于 Linux 的操作系统)上,您可能需要安装一个单独的包以得到这个扩展可用。
扩展实现的线程模型是Thread
“每个解释器一个线程”。这意味着,每个线程只能“托管”一个 Tcl 解释器(及其无限数量的子解释器),但任何线程执行的代码都不能访问托管在其他线程中的解释器。反过来,这意味着当您在 Tcl 中使用线程时,您必须掌握多解释器的概念。
在不同线程中运行的解释器之间交换数据的经典方法是消息传递:您将脚本发布到在不同线程中运行的目标解释器的输入队列中,然后等待回复。另一方面,线程共享变量(通过锁定实现共享内存)也可用。另一个可用功能是支持线程池。
阅读“Tcl 和线程” wiki 页面、Thread
扩展手册页。
代码示例在 wiki 上。这里只是其中之一。
请注意,如果您认为必须并行运行的程序主要受 I/O 限制(即,它们从网络读取某些内容和/或在那里发送某些内容)而不是CPU 限制(进行大量计算) ),使用基于事件的处理方法可能会获得更好的结果:Tcl 具有对事件循环的内置支持,并且当可以从通道读取下一个数据块时,您可以让 Tcl 执行您的代码(例如网络套接字)或写入通道。