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