TCL伪挂起出口

TCL伪挂起出口,tcl,exec,stdout,freeze,stderr,Tcl,Exec,Stdout,Freeze,Stderr,简单TCL悬挂 我使用非常简单的TCL脚本来重现我的问题。我在Windows7上运行ActiveTCL8.6.4.1。 我使用一个简单的批处理文件(loop.bat),它在循环中调用一个tcl脚本(1.tcl)。然后,该脚本执行一些“put”,并打开另一个TCL shell来调用另一个TCL脚本(2.TCL)。第二个脚本执行两个“put”,一个在stdout上,一个在stderr上,然后返回 为了重现这个问题,我启动了loop.bat的16个实例,并让它运行了一整夜。当我早上回来时,大约有一半的

简单TCL悬挂

我使用非常简单的TCL脚本来重现我的问题。我在Windows7上运行ActiveTCL8.6.4.1。 我使用一个简单的批处理文件(loop.bat),它在循环中调用一个tcl脚本(1.tcl)。然后,该脚本执行一些“put”,并打开另一个TCL shell来调用另一个TCL脚本(2.TCL)。第二个脚本执行两个“put”,一个在stdout上,一个在stderr上,然后返回

为了重现这个问题,我启动了loop.bat的16个实例,并让它运行了一整夜。当我早上回来时,大约有一半的实例被暂停(挂起)

以下是我使用的代码:

环蝙蝠 1.tcl 2.tcl 为了重现这个问题,我启动了loop.bat的16个实例,并让它运行了一整夜。当我早上回来时,大约有一半的实例被暂停(挂起)

通过“exec”、“put”地址和批处理循环的迭代创建了新线程和文件套接字。如果套接字或线程的创建速度快于恢复速度,则调用的“子”进程最终将耗尽可用的套接字或线程


这可能有助于解释:

解决方案可能是让Windows更多地控制进程,并使用
start
执行
tclsh86

@echo off
:loop
start /b /wait tclsh86 1.tcl
goto loop

这或许可以解决问题/b'禁止每次启动
tclsh86
时创建新控制台。

如果使用
exit
而不是
return
,是否会发生这种情况?@DonalFellows:是的,我在exit方面有完全相同的问题,但我读到它的代码没有遵循一些MSDN准则,可能会导致挂起,就像我所经历的那样。这就是为什么我切换到级联返回而不是退出,但我仍然看到它。打开它,这样它就是
[catch{exec…}resuts]
@wolfhammer您完全正确。评估是从我的“真实案例”中进行的。我删除了它,想知道它是否以任何方式与我的问题相关,但我仍然和以前一样挂起。我不知道链接是如何关联的。它讨论进程内的线程堆栈大小。但在这个问题上,新的进程产生了,每个进程都有自己的堆栈空间。显然是什么原因导致了这个问题,但我不认为陈瑞敏的博客文章解释了这一点。或者我需要更多的解释,因为我看不到。
puts "start 1.tcl"
set error [catch {eval {exec tclsh86 2.tcl >@stdout 2>@stderr}} results]
puts "error = $error"
puts "results = $results"
puts "end 1.tcl"
return 0
puts stdout "Print to stdout from 2.tcl."
puts stderr "Print to stderr from 2.tcl."
return 1
@echo off
:loop
start /b /wait tclsh86 1.tcl
goto loop