在Fortran代码中运行部分程序一段时间

时间:2014-06-05 22:33:30

标签: fortran

我想在指定的时间内运行代码(或外部可执行文件)。例如,在Fortran中我可以

 call system('./run')

有没有办法可以限制它的运行让我们说10秒,例如如下

 call system('./run', 10)

我想从Fortran代码中执行此操作,上面的示例是针对系统命令的,但我也希望对我的代码的其他一些子例程执行此操作。例如,

 call performComputation(10)

其中performComputation只能运行10秒。它将运行的系统是Linux。

谢谢!

2 个答案:

答案 0 :(得分:2)

<强> EDITED

啊,我明白了 - 你想在有限的时间内将作为当前程序的一部分。我看到了很多选择......

选项1

修改要在有限时间内运行的子程序,以便它们采用一个附加参数,即可以运行的秒数。然后修改子程序以在开始时获得系统时间,然后在它们的处理循环中再次获取时间并退出循环并在时间差超过允许的最大秒数时返回调用者。

缺点是,这需要您更改每个子程序。它会彻底退出子程序。

选项2

利用线程库 - 例如并行线程。当您想要使用超时调用子例程时,创建一个与主程序并行运行的新线程,并在该执行线程内执行子例程。然后在主程序中,睡眠10秒钟,然后终止正在运行子程序的线程。

这非常简单,并且不需要更改所有子例程。它不是那么优雅,因为它会在某个随机点上将你的子程序从你的子程序中删除,也许是在它最不期望的时候。

想象一下在以下示例中向下运行页面的时间,主程序操作在左侧,子程序操作在右侧。

MAIN                                SUBROUTINE YOUR_SUB
... something ..
... something ...
f_pthread_create(,,,YOUR_SUB,)      start processing
sleep(10)                           ... calculate ...
                                    ... calculate ...
                                    ... calculate ...
f_pthread_kill()
... something ..
... something ...

选项3

抽象出你想要调用的子程序并将它们放入各自独立的可执行文件中,然后按照我原来的答案继续。

无论您选择哪种方案,您都必须考虑如何从您正在调用的子程序中获得结果 - 它是否会将它们存储在文件中?主程序是否需要访问它们?它们是全局变量吗?原因是如果你要遵循选项2或3,那么子程序就不会有返回值。

原始答案

如果您没有timeout,则可以

call system('./run & sleep 10; kill $!')

答案 1 :(得分:0)

是的,有办法。看一下linux命令timeout

# run command for 10 seconds and then send it SIGTERM kill message
# if not finished.
call system('timeout 10 ./run') 

实施例

# finishes in 10 seconds with a return code of 0 to indicate success.
sleep 10 

# finishes in 1 second with a return code of `124` to indicate timed out.
timeout 1 sleep 10 

您还可以通过指定-s参数来选择要发送的终止信号的类型。有关详细信息,请参阅man timeout