用newlisp cilk API可以实现多进程通信。在实际应用中,父进程发送消息给多个子进程,使得父进程可以专注于自己的工作,把一些额外的工作交给子进程去完成,做到对父进程任务无阻塞的效果。
这里的例子程序是process.lsp文件,这样调用:
./process.lsp --process-number=5 child-process-list: (4289 4288 4287 4286 4285) child process: 4289 child process: 4288 child process: 4287 child process: 4286 child process: 4285
5个子进程被创建的信息被父进程打印在控制台上。
5个子进程都有自己的日志文件,里面是接收到来自父进程的消息。
-rw-r--r-- 1 dean dean 9 Sep 13 19:29 4285.log -rw-r--r-- 1 dean dean 9 Sep 13 19:29 4286.log -rw-r--r-- 1 dean dean 9 Sep 13 19:29 4287.log -rw-r--r-- 1 dean dean 9 Sep 13 19:29 4288.log -rw-r--r-- 1 dean dean 9 Sep 13 19:29 4289.log消息内容如下:
$ cat 4285.log test msg
首先有一个args.lsp负责解析参数
;; parse args into Tree (define (parse-args) (new Tree 'ArgsTree) (dolist (arg (main-args)) (if (find "=" arg) (begin (setq pair (parse arg "=")) (ArgsTree (pair 0) (pair 1)) ) ) ) )
#!/usr/bin/newlisp (load "args.lsp") (parse-args) (setq process-number (int (ArgsTree "--process-number"))) (define (child-process) (setq ppid (sys-info 6)) ; get parent pid (setq cur-pid (sys-info 7)) (while true (if (receive ppid msg) (begin ;; get new message from queue (append-file (string cur-pid ".log") (string msg "\n")) ) (begin ;; get nothing from queue, sleep 1 second (sleep 1000) ) ) ) ) ; parent starts child processes (dotimes (i process-number) (spawn 'result (child-process) true) ) ;; parent send one msg to each child process (setf child-process-list (sync)) (println "child-process-list: " child-process-list) (dolist (cpid child-process-list) (println "child process: " cpid) (send cpid "test msg") ) ;; quit in 10 seconds (sleep 10000) (abort) (exit)