多进程

多进程

多进程 Multiprocessing 和多线程 threading 类似,用来弥补 threading 的一些劣势(例如GIL), Python 出了一个 multiprocessing

多进程与多线程

使用方法几乎一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import multiprocessing
import threading

def job_t(a,d):
print('tttt')

def job_p(a,d):
print('pppp')


t1 = threading.Thread(target=job_t,args=(1,2))
p1 = multiprocessing.Process(target=job_p,args=(1,2))
t1.start()
p1.start()

t1.join()
p1.join()

进程结果 Queue()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import multiprocessing as mp

def job(q):
res=0
for i in range(1000):
res+=i+i**2+i**3
q.put(res) #queue

if __name__=='__main__':
q = mp.Queue()
p1 = mp.Process(target=job,args=(q,))
p2 = mp.Process(target=job,args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()
print(res1)
res2 = q.get()
print(res2)
print(res1+res2)

效率对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import time
import multiprocessing
import threading

def _cost_time(func):
def warpper(*args,**kw):
start_time = time.time()
func(*args,**kw)
end_time = time.time()
print('cost time :',end_time - start_time)
return warpper


def job(q):
res = 0
for i in range(1000000):
res += i + i**2 + i**3
q.put(res) # queue

@_cost_time
def normal():
res = 0
for _ in range(2):
for i in range(1000000):
res += i + i**2 + i**3
print('normal:', res)


@_cost_time
def multithread():
q = multiprocessing.Queue()
t1 = threading.Thread(target=job, args=(q,))
t2 = threading.Thread(target=job, args=(q,))
t1.start()
t2.start()
t1.join()
t2.join()
res1 = q.get()
res2 = q.get()
print('multithread:', res1 + res2)


@_cost_time
def multicore():
q = multiprocessing.Queue()
p1 = multiprocessing .Process(target=job, args=(q,))
p2 = multiprocessing .Process(target=job, args=(q,))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()
res2 = q.get()
print('multicore:',res1 + res2)


normal()
multithread()
multicore()

打印结果

1
2
3
4
5
6
('normal:', 499999666667166666000000L)
('cost time :', 0.8630490303039551)
('multithread:', 499999666667166666000000L)
('cost time :', 1.8854999542236328)
('multicore:', 499999666667166666000000L)
('cost time :', 0.47038793563842773)

耗时 多进程 < 普通 < 多线程

多线程不适合计算密集型