File tree Expand file tree Collapse file tree 3 files changed +122
-0
lines changed Expand file tree Collapse file tree 3 files changed +122
-0
lines changed Original file line number Diff line number Diff line change 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+
Original file line number Diff line number Diff line change 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+
Original file line number Diff line number Diff line change 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 )
You can’t perform that action at this time.
0 commit comments