This topic created in 3735 days ago, the information mentioned may be changed or developed.
当程序运行时,父进程 fork 出 4 个子进程。父进程负责产生消息(每 1s 产生一个消息), 4 个子进程负责处理消息。父子进程之间通过消息队列来传递消息。
父进程需要维护一个本地数据库(格式与共享数据库相同),当生成一个消息时,父进程要同步更新本地数据库。子进程在处理消息时,根据消息的内容来对共享数据库进行更新(比如,当一个子进程收到一个[index=2, op=increase]的消息时,需要将共享数据库中 index 为 2 的条目的 count 值递增 1 ),并延迟 500ms 。
父进程需要处理 SIGTERM 信号。父进程接收到 SIGTERM 信号意味着要求结束该程序。在结束程序之前,父进程要结束所有子进程、显示并对比本地数据库和共享数据库中的信息(两者应该相同)。
13 replies • 2016-03-16 08:01:12 +08:00
 |
|
1
yuelang85 Mar 15, 2016
fork 的时候可以拿到子进程 pid ,可以向子进程发 signal 。
|
 |
|
3
lijianying10 Mar 15, 2016
方法有很多 Socket 通讯 如果是在同一台机器上可以用 Named pipe
高级一点就用 MPI 。
也许 Message Queue 也适合你。 这个是 Broker 的通讯方式。
如果你不想要 Broker 可以尝试 RPC ,类似 Thrift Grpc 都可以试试啊。
或者干脆基于事件分析,做个简单的 pub sub 也可以有。
以上这些总有一款适合你。当然我不是很了解您的情况。只是个人拙见。
|
 |
|
6
znoodl Mar 15, 2016
我觉得多线程更好处理呢,可以用线程间通信更合适,多线程有共享数据,又独立运行,主线程退出整个程序(包括其他线程)都会退出
|
 |
|
8
neoblackcap Mar 15, 2016 via iPhone
RPC 方法实在太多,不过自己实现的话,套用专家的说法,请基于 TCP 。否则就选各类 MQ 吧
|
 |
|
11
ipconfiger Mar 15, 2016
给个栗子给你
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 '所有数据都写入并且读完'
|
 |
|
13
mckelvin Mar 16, 2016 via iPhone
如果你要实现某个功能而非学习的目的,可以用 zeromq 做
|