IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]父子进程发送和接收消息

    sheismylife发表于 2016-09-13 19:43:16
    love 0

    用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个子进程。

    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))
    	  )
    	)
        )
      )

    然后有一个process.lsp完成所有工作

    #!/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)
    


    父进程通过send发送消息,子进程通过receiv接收消息,使用了循环和等待,一直反复接收消息。



沪ICP备19023445号-2号
友情链接