Skip to content

Commit 630c22c

Browse files
Merge pull request geekcomputers#460 from weiyanhua100/master
add communication.
2 parents 14430f7 + 2d236d7 commit 630c22c

File tree

3 files changed

+122
-0
lines changed

3 files changed

+122
-0
lines changed

communication/file.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
#!/usr/bin/python
2+
# coding: utf-8
3+
4+
import os
5+
import sys
6+
import math
7+
8+
9+
def slice(mink, maxk):
10+
s = 0.0
11+
for k in range(mink, maxk):
12+
s += 1.0/(2*k+1)/(2*k+1)
13+
return s
14+
15+
16+
def pi(n):
17+
pids = []
18+
unit = n / 10
19+
for i in range(10): # 分10个子进程
20+
mink = unit * i
21+
maxk = mink + unit
22+
pid = os.fork()
23+
if pid > 0:
24+
pids.append(pid)
25+
else:
26+
s = slice(mink, maxk) # 子进程开始计算
27+
with open("%d" % os.getpid(), "w") as f:
28+
f.write(str(s))
29+
sys.exit(0) # 子进程结束
30+
sums = []
31+
for pid in pids:
32+
os.waitpid(pid, 0) # 等待子进程结束
33+
with open("%d" % pid, "r") as f:
34+
sums.append(float(f.read()))
35+
os.remove("%d" % pid) # 删除通信的文件
36+
return math.sqrt(sum(sums) * 8)
37+
38+
if __name__ == '__main__':
39+
print "start"
40+
print pi(10000000)
41+

communication/pipe.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# coding: utf-8
2+
3+
import os
4+
import sys
5+
import math
6+
7+
8+
def slice(mink, maxk):
9+
s = 0.0
10+
for k in range(mink, maxk):
11+
s += 1.0/(2*k+1)/(2*k+1)
12+
return s
13+
14+
15+
def pi(n):
16+
childs = {}
17+
unit = n / 10
18+
for i in range(10): # 分10个子进程
19+
mink = unit * i
20+
maxk = mink + unit
21+
r, w = os.pipe()
22+
pid = os.fork()
23+
if pid > 0:
24+
childs[pid] = r # 将子进程的pid和读描述符存起来
25+
os.close(w) # 父进程关闭写描述符,只读
26+
else:
27+
os.close(r) # 子进程关闭读描述符,只写
28+
s = slice(mink, maxk) # 子进程开始计算
29+
os.write(w, str(s))
30+
os.close(w) # 写完了,关闭写描述符
31+
sys.exit(0) # 子进程结束
32+
sums = []
33+
34+
for pid, r in childs.items():
35+
sums.append(float(os.read(r, 1024)))
36+
os.close(r) # 读完了,关闭读描述符
37+
os.waitpid(pid, 0) # 等待子进程结束
38+
return math.sqrt(sum(sums) * 8)
39+
40+
41+
print pi(10000000)
42+

communication/socket_conn.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# coding: utf-8
2+
3+
import os
4+
import sys
5+
import math
6+
import socket
7+
8+
def slice(mink, maxk):
9+
s = 0.0
10+
for k in range(mink, maxk):
11+
s += 1.0/(2*k+1)/(2*k+1)
12+
return s
13+
14+
def pi(n):
15+
childs = {}
16+
unit = n / 10
17+
for i in range(10): # 分10个子进程
18+
mink = unit * i
19+
maxk = mink + unit
20+
rsock, wsock = socket.socketpair()
21+
pid = os.fork()
22+
if pid > 0:
23+
childs[pid] = rsock
24+
wsock.close()
25+
else:
26+
rsock.close()
27+
s = slice(mink, maxk) # 子进程开始计算
28+
wsock.send(str(s))
29+
wsock.close()
30+
sys.exit(0) # 子进程结束
31+
sums = []
32+
for pid, rsock in childs.items():
33+
sums.append(float(rsock.recv(1024)))
34+
rsock.close()
35+
os.waitpid(pid, 0) # 等待子进程结束
36+
return math.sqrt(sum(sums) * 8)
37+
38+
39+
print pi(10000000)

0 commit comments

Comments
 (0)