如何使tcl后台进程等待文件?

如何使tcl后台进程等待文件?,tcl,Tcl,我正在尝试编写一个进程,它在后台等待一个文件,并启动一个命令,在等待过程中不断卡住 我的代码: 现在,当我在后台模式下调用这个proc时,它会阻塞我的shell直到完成。shell记录键击,但在 kuu> 文件之后,只考虑它们。 空转后卡在库库上 还尝试创建一个高级版本的proc,但仍然得到相同的行为。 难道没有一种方法可以在不干扰tcl shell的情况下等待文件创建吗? 我的目标是让这些后台运行中的2-3个并行运行,每个都在等待其他东西,然后启动其他东西 哦,值得一提的是,我无法访问这个en

我正在尝试编写一个进程,它在后台等待一个文件,并启动一个命令,在等待过程中不断卡住
我的代码:

现在,当我在后台模式下调用这个proc时,它会阻塞我的shell直到完成。shell记录键击,但在<强> kuu> <强>文件之后,只考虑它们。 空转后卡在库库上
还尝试创建一个高级版本的proc,但仍然得到相同的行为。
难道没有一种方法可以在不干扰tcl shell的情况下等待文件创建吗?
我的目标是让这些后台运行中的2-3个并行运行,每个都在等待其他东西,然后启动其他东西


哦,值得一提的是,我无法访问这个env上的Threads包,因此必须使用vanilla tcl 8.6after命令具有阻塞和非阻塞模式。你在用一种阻塞的方式。只需使用它的非阻塞模式:

proc stuck_on_kuku {} {
    if {[file exists kuku]} {
        echo done sleeping ; # here your command should appear
    } else {
        after 3000 stuck_on_kuku; # simulated "threading" without threads
    }
}

请注意,通过这种设置,您可以更频繁地检查条件,而不会占用太多CPU时间。尝试在100次之后执行
,每秒检查10次,并使用几乎0%的CPU时间。

after
命令具有阻塞和非阻塞模式。你在用一种阻塞的方式。只需使用它的非阻塞模式:

proc stuck_on_kuku {} {
    if {[file exists kuku]} {
        echo done sleeping ; # here your command should appear
    } else {
        after 3000 stuck_on_kuku; # simulated "threading" without threads
    }
}

请注意,通过这种设置,您可以更频繁地检查条件,而不会占用太多CPU时间。尝试在100之后执行
检查,每秒检查10次,并使用几乎0%的CPU时间。

使用第二个参数来模拟线程。在其他语言中,这称为绿色线程。在Javascript和Tcl中,它被称为事件循环,使用第二个参数来模拟线程。在其他语言中,这称为绿色线程。在Javascript和Tcl中,它被称为“节省CPU电量”部分的事件循环!立即尝试after命令在等待时似乎会导致问题-该命令肯定会有一些剩余成本,使其花费的时间比我给出的3秒长得多,并且它等待的时间越长,实际执行某项操作的可能性越小。如果branchI几乎从不在
之后使用
的阻塞形式,那么在等待一个小时(这是我的运行时间的简称)时,proc永远不会到达正方向的命令;几乎总是有一些其他的东西,程序可以在同一时间有用地做。幸运的是,使用协同程序(Tcl 8.6以后的版本),您可以编写与阻塞形式非常相似的代码,而不需要实际阻塞。@Donalvellow在Tcl编写程序的多年经验教会了我很多东西,并在我需要开始认真使用Javascript时为我提供了准备。我对异步流的理解很大程度上仍然基于我在TCL中所做的工作。如果在3000秒后给出,那么3秒仅仅是它睡眠的
最小时间,而不是确切的时间。脚本执行的时间取决于tcl处理的其他事件(网络、磁盘I/O等)的数量,因为所有这些都只在一个线程中发生,单个线程无法并行执行两件事情。如果您的程序中有一个无限循环,例如
while
之后的
永远不会被调用,因为它再次是单线程的,这意味着当您执行其他代码时,tcl不能做其他事情解决了“节省CPU电源”部分!立即尝试after命令在等待时似乎会导致问题-该命令肯定会有一些剩余成本,使其花费的时间比我给出的3秒长得多,并且它等待的时间越长,实际执行某项操作的可能性越小。如果branchI几乎从不在
之后使用
的阻塞形式,那么在等待一个小时(这是我的运行时间的简称)时,proc永远不会到达正方向的命令;几乎总是有一些其他的东西,程序可以在同一时间有用地做。幸运的是,使用协同程序(Tcl 8.6以后的版本),您可以编写与阻塞形式非常相似的代码,而不需要实际阻塞。@Donalvellow在Tcl编写程序的多年经验教会了我很多东西,并在我需要开始认真使用Javascript时为我提供了准备。我对异步流的理解很大程度上仍然基于我在TCL中所做的工作。如果在3000秒后给出,那么3秒仅仅是它睡眠的
最小时间,而不是确切的时间。脚本执行的时间取决于tcl处理的其他事件(网络、磁盘I/O等)的数量,因为所有这些都只在一个线程中发生,单个线程无法并行执行两件事情。如果在程序中有一个无限循环,例如
while
之后的
永远不会被调用,因为再次是单线程的,这意味着在执行其他代码时,tcl不能做其他事情