如何在Isabelle ML中进行简单的多线程处理?

时间:2014-10-27 17:40:18

标签: isabelle

我找到了想要启动多个Isabelle_System.bash进程的用途。

在下一个源代码中,我使用了3个bash命令。举个简单的例子,我想在不同的线程中启动它们,这样它们就可以并发运行,而不是顺序运行。

ML {*
 Isabelle_System.bash ("echo '1. Call script to compile in the PIDE console.'");
 Isabelle_System.bash ("echo '2. Call script to compile in a Windows console.'");
 Isabelle_System.bash ("echo '3. Maybe a third process.'");
 (*In an outer syntax command, I have options to allow 1 and 2, so it might be 
   useful to allow starting both at the same time, to be able to terminate the 
   PIDE process, and let the Windows console keep running. But, unless  
   multithreading is used, their execution will be sequential, which is 
   useless.*)
*}

我做了一个grep,我找到了src/Pure/Concurrent/simple_thread.ML

但是,这不是优先事项,对我来说,使用反复试验来找出自己需要做的事情并不是最好的。

如果有人可以给我一个简单的即插即用模板来运行上面的3个bash命令,我将不胜感激。或者,也许有人可以告诉我为什么我不能或不应该这样做。

2 个答案:

答案 0 :(得分:0)

"简单的多线程"是矛盾的,因为线程从不简单。如果您只想进行简单的并行编程,那么首先要看的是结构Par_List,例如Par_List.map组合子。在Isabelle/Isar Implementation Manual中有一个关于"平行骨架"的部分。关于它,以及附近的更多信息。

答案 1 :(得分:0)

在这里,我根据Makarius Wenzel的回答填写了一些细节。

事实证明,使用src / Pure中的Isabelle / ML库,运行并行,独立的bash进程非常容易:

ML {* (*Running this multiple times shows the order of execution varies.*)
  Par_List.map : ('a -> 'b) -> 'a list -> 'b list;
  val bash_strings = [
    "echo 'Echo 1.'; echo 'Echo 1.'; echo 'Echo 1.'; echo 'Echo 1.' ", 
    "echo 'Bash 2, bro!'", 
    "echo 'Bash 3, hombre or señorita!'", 
    "echo 'Bash 4, dude!'"];
  val _ = Par_List.map Isabelle_System.bash bash_strings
*} (*
OUTPUT:
  Bash 4, dude! 
  Bash 2, bro! 
  Bash 3, hombre or señorita! 
  Echo 1.
  Echo 1.
  Echo 1.
  Echo 1. 
  val it = fn: ('a -> 'b) -> 'a list -> 'b list
  val bash_strings =
     ["echo 'Echo 1.'; echo 'Echo 1.'; echo 'Echo 1.'; echo 'Echo 1.' ",
      "echo 'Bash 2, bro!'", "echo 'Bash 3, hombre or señorita!'",
      "echo 'Bash 4, dude!'"]:
     string list*)

针对多个月实施问题的5分钟解决方案,不计算提问,阅读答案,打开PDF,启动PIDE以及在锁定到显示简单的某些来源之前键入各种内容的开销有效的例子。