进程是由系统自己管理的。
1:最基本的写法
1
2
3
4
5
6
7
8
9
|
from multiprocessing import Pool
def f(x):
return x * x
if __name__ = = '__main__' :
p = Pool( 5 )
print (p. map (f, [ 1 , 2 , 3 ]))
[ 1 , 4 , 9 ]
|
2、实际上是通过os.fork的方法产生进程的
unix中,所有进程都是通过fork的方法产生的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
multiprocessing Process
os
info(title):
title
, __name__
(os, ): , os.getppid()
, os.getpid()
f(name):
info()
, name
__name__ = = :
info()
p = Process( = f, = (,))
p.start()
p.join()
|
3、线程共享内存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
threading
run(info_list,n):
info_list.append(n)
info_list
__name__ = = :
info = []
i ():
p = threading.Thread( = run, = [info,i])
p.start()
[ 0 ]
[ 0 , 1 ]
[ 0 , 1 , 2 ]
[ 0 , 1 , 2 , 3 ]
[ 0 , 1 , 2 , 3 , 4 ]
[ 0 , 1 , 2 , 3 , 4 , 5 ]
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 ]
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ]
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
|
进程不共享内存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
multiprocessing Process
run(info_list,n):
info_list.append(n)
info_list
__name__ = = :
info = []
i ():
p = Process( = run, = [info,i])
p.start()
[ 1 ]
[ 2 ]
[ 3 ]
[ 0 ]
[ 4 ]
[ 5 ]
[ 6 ]
[ 7 ]
[ 8 ]
[ 9 ]
|
若想共享内存,需使用multiprocessing模块中的Queue
1
2
3
4
5
6
7
8
9
10
11
|
multiprocessing Process, Queue
f(q,n):
q.put([n,])
__name__ = = :
q = Queue()
i ():
p = Process( = f, = (q,i))
p.start()
:
q.get()
|
4、锁:仅是对于屏幕的共享,因为进程是独立的,所以对于多进程没有用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
multiprocessing Process, Lock
f(l, i):
l.acquire()
, i
l.release()
__name__ = = :
lock = Lock()
num ():
Process( = f, = (lock, num)).start()
hello world 0
hello world 1
hello world 2
hello world 3
hello world 4
hello world 5
hello world 6
hello world 7
hello world 8
hello world 9
|
5、进程间内存共享:Value,Array
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
multiprocessing Process, Value, Array
f(n, a):
n.value = i ((a)):
a[i] = - a[i]
__name__ = = :
num = Value(, )
arr = Array(, ())
num.value
arr[:]
p = Process( = f, = (num, arr))
p.start()
p.join()
0.0
[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]
3.1415927
[ 0 , - 1 , - 2 , - 3 , - 4 , - 5 , - 6 , - 7 , - 8 , - 9 ]
|
#manager共享方法,但速度慢
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
multiprocessing Process, Manager
f(d, l):
d[] = d[] = d[] = l.reverse()
__name__ = = :
manager = Manager()
d = manager. dict ()
l = manager. list (())
p = Process( = f, = (d, l))
p.start()
p.join()
d
l
# print '-------------'这里只是另一种写法
# print pool.map(f,range(10))
{ 0.25 : None , 1 : '1' , '2' : 2 }
[ 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 ]
|
#异步:这种写法用的不多
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
multiprocessing Pool
time
f(x):
x * x
time.sleep()
x * x
__name__ = = :
pool = Pool( = )
res_list = []
i ():
res = pool.apply_async(f,[i]) res_list.append(res)
r res_list:
r.get(timeout = 10 ) #超时时间
|
同步的就是apply