进程间通信该怎么实现

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

高级一点就用 MPI 。

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

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

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

以上这些总有一款适合你。当然我不是很了解您的情况。只是个人拙见。
wizardoz
2016-03-15 21:30:18 +08:00
不明觉厉
Alchemistxxd
2016-03-15 21:31:54 +08:00
看都看不懂
znoodl
2016-03-15 21:46:57 +08:00
我觉得多线程更好处理呢,可以用线程间通信更合适,多线程有共享数据,又独立运行,主线程退出整个程序(包括其他线程)都会退出
jimzhong
2016-03-15 21:57:24 +08:00
用管道或者 socket 吧
neoblackcap
2016-03-15 22:17:53 +08:00
RPC 方法实在太多,不过自己实现的话,套用专家的说法,请基于 TCP 。否则就选各类 MQ 吧
ryanking8215
2016-03-15 22:23:35 +08:00
pipe+signal
ipconfiger
2016-03-15 22:23:42 +08:00
用 Queue 啊
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
2016-03-15 22:39:07 +08:00
明明有简单的方法,非要做的这么复杂
mckelvin
2016-03-16 08:01:12 +08:00
如果你要实现某个功能而非学习的目的,可以用 zeromq 做

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/263744

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX