V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhongshaohua
V2EX  ›  程序员

进程间通信该怎么实现

  •  
  •   zhongshaohua · 2016-03-15 20:44:06 +08:00 · 3832 次点击
    这是一个创建于 3181 天前的主题,其中的信息可能已经有所发展或是发生改变。
    当程序运行时,父进程 fork 出 4 个子进程。父进程负责产生消息(每 1s 产生一个消息), 4 个子进程负责处理消息。父子进程之间通过消息队列来传递消息。
    父进程需要维护一个本地数据库(格式与共享数据库相同),当生成一个消息时,父进程要同步更新本地数据库。子进程在处理消息时,根据消息的内容来对共享数据库进行更新(比如,当一个子进程收到一个[index=2, op=increase]的消息时,需要将共享数据库中 index 为 2 的条目的 count 值递增 1 ),并延迟 500ms 。
    父进程需要处理 SIGTERM 信号。父进程接收到 SIGTERM 信号意味着要求结束该程序。在结束程序之前,父进程要结束所有子进程、显示并对比本地数据库和共享数据库中的信息(两者应该相同)。
    13 条回复    2016-03-16 08:01:12 +08:00
    yuelang85
        1
    yuelang85  
       2016-03-15 20:51:29 +08:00
    fork 的时候可以拿到子进程 pid ,可以向子进程发 signal 。
    knightdf
        2
    knightdf  
       2016-03-15 21:01:34 +08:00
    这需要用进程来做?
    lijianying10
        3
    lijianying10  
       2016-03-15 21:07:04 +08:00
    方法有很多 Socket 通讯
    如果是在同一台机器上可以用 Named pipe

    高级一点就用 MPI 。

    也许 Message Queue 也适合你。 这个是 Broker 的通讯方式。

    如果你不想要 Broker 可以尝试 RPC ,类似 Thrift Grpc 都可以试试啊。

    或者干脆基于事件分析,做个简单的 pub sub 也可以有。

    以上这些总有一款适合你。当然我不是很了解您的情况。只是个人拙见。
    wizardoz
        4
    wizardoz  
       2016-03-15 21:30:18 +08:00
    不明觉厉
    Alchemistxxd
        5
    Alchemistxxd  
       2016-03-15 21:31:54 +08:00
    看都看不懂
    znoodl
        6
    znoodl  
       2016-03-15 21:46:57 +08:00
    我觉得多线程更好处理呢,可以用线程间通信更合适,多线程有共享数据,又独立运行,主线程退出整个程序(包括其他线程)都会退出
    jimzhong
        7
    jimzhong  
       2016-03-15 21:57:24 +08:00
    用管道或者 socket 吧
    neoblackcap
        8
    neoblackcap  
       2016-03-15 22:17:53 +08:00 via iPhone
    RPC 方法实在太多,不过自己实现的话,套用专家的说法,请基于 TCP 。否则就选各类 MQ 吧
    ryanking8215
        9
    ryanking8215  
       2016-03-15 22:23:35 +08:00
    pipe+signal
    ipconfiger
        10
    ipconfiger  
       2016-03-15 22:23:42 +08:00
    用 Queue 啊
    ipconfiger
        11
    ipconfiger  
       2016-03-15 22:33:59 +08:00
    给个栗子给你


    from multiprocessing import Process, Queue
    import os, time, random

    # 写数据进程执行的代码:
    def write(q):
    for value in ['A', 'B', 'C']:
    print 'Put %s to queue...' % value
    q.put(value)
    time.sleep(random.random())

    # 读数据进程执行的代码:
    def read(q):
    while True:
    if not q.empty():
    value = q.get(True)
    print 'Get %s from queue.' % value
    time.sleep(random.random())
    else:
    break

    if __name__=='__main__':
    # 父进程创建 Queue ,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程 pw ,写入:
    pw.start()
    # 等待 pw 结束:
    pw.join()
    # 启动子进程 pr ,读取:
    pr.start()
    pr.join()
    # pr 进程里是死循环,无法等待其结束,只能强行终止:
    print
    print '所有数据都写入并且读完'
    alexapollo
        12
    alexapollo  
       2016-03-15 22:39:07 +08:00
    明明有简单的方法,非要做的这么复杂
    mckelvin
        13
    mckelvin  
       2016-03-16 08:01:12 +08:00 via iPhone
    如果你要实现某个功能而非学习的目的,可以用 zeromq 做
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2775 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:37 · PVG 13:37 · LAX 21:37 · JFK 00:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.