hop-2012/server/thirdparty/lwt-2.3.2/examples/unix/parallelize.ml

58 lines
1.9 KiB
OCaml

(* Lightweight thread library for Objective Caml
* http://www.ocsigen.org/lwt
* Program Parallelize
* Copyright (C) 2011 Jérémie Dimino
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, with linking exceptions;
* either version 2.1 of the License, or (at your option) any later
* version. See COPYING file for details.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*)
(* Reads commands from standard input and launch them in parallel,
using as many processes as the number of CPUs. *)
open Lwt
(* Reads one command, launch it and waits for when it termination,
then start again: *)
let rec launch () =
match_lwt Lwt_io.read_line_opt Lwt_io.stdin with
| None ->
return ()
| Some line ->
lwt exit_status = Lwt_process.exec (Lwt_process.shell line) in
launch ()
(* Creates the initial <N> threads, where <N> is the number of
CPUs: *)
let rec create_threads = function
| 0 ->
return ()
| n ->
launch () <&> create_threads (n - 1)
(* Counts the number of CPUs using "/proc/cpuinfo": *)
let cpus_count () =
Lwt_stream.fold (fun _ n -> succ n)
(Lwt_stream.filter
(fun line ->
try
Scanf.sscanf line "processor :" true
with _ ->
false)
(Lwt_io.lines_of_file "/proc/cpuinfo")) 0
lwt () = cpus_count () >>= create_threads