python进程结尾
管道
1 from multiprocessing import Process,Pipe
2
3 def f1(conn):
4 from_master_msg = conn.recv()
5 print('这是子进程')
6 print('来自主进程的消息:',from_master_msg)
7
8 if __name__ == '__main__':
9 # 创建一个管道对象,全双工,返回管道的两端,但是一端发送的消息,只能另外一端接收,自己这一端是不能接收的
10 conn1,conn2 = Pipe()
11
12 # 可以将一端或者两端发送给其他的进程,那么多个进程之间就可以通过这一个管道进行通信了
13 p1 = Process(target=f1,args=(conn2,))
14 p1.start()
15
16 conn1.send('猜猜我是谁')
17
18 print('我是主进程')
事件
1 #创建事件对象,这个对象的初识状态为False
2 e = Event()
3 print('e的状态是:',e.is_set())
4
5 print('程序运行到这里了')
6
7 # 将e的状态改为True
8 e.set()
9 print('e的状态是:',e.is_set())
10
11 # 将e的状态改为False
12 e.clear()
13
14 # e这个事件对象如果值为False,就在wait的地方等待
15 e.wait()
16
17 print('进程经过了wait')
基于事件的进程通信
1 import time
2 from multiprocessing import Process,Event
3
4 def f1(e):
5 time.sleep(2)
6 n = 100
7 print('子进程n的值:',n)
8 e.set()
9
10 if __name__ == '__main__':
11 e = Event()
12
13 p = Process(target=f1,args=(e,))
14 p.start()
15
16 print('主进程等待')
17 e.wait()
18 print('结果已经写入文件了,可以拿到这值')
19 结果
20 主进程等待
21 子进程n的值: 100
22 结果已经写入文件了,可以拿到这值
信号量
1 import time
2 import random
3 from multiprocessing import Process,Semaphore
4
5 def f1(i,s):
6 s.acquire()
7 print('%s号到了'%i)
8
9 time.sleep(random.randint(1,3))
10 s.release()
11
12 if __name__ == '__main__':
13 s = Semaphore(4)
14 for i in range(10):
15 p = Process(target=f1,args=(i,s))
16 p.start()
进程池map方法
对比多进程和进程池的效率
1 import time
2 from multiprocessing import Process,Pool
3
4 def f1(n):
5 for i in range(5):
6 n += i
7 if __name__ == '__main__':
8
9 #统计进程池执行100个任务的时间
10 s_time = time.time()
11
12 #4表示进程池中启动4个进程,如果不传参数,默认开启的融锦城数一般是cpu的个数
13 pool = Pool(4)
14
15 #参数数据必须是可迭代的,异步提交任务,自带join功能
16 pool.map(f1,range(100))
17 e_time = time.time()
18 dif_time = e_time - s_time
19
20 #统计100个进程,来执行100个任务的执行时间
21 p_s_t = time.time() #多进程起始时间
22 p_list = []
23 for i in range(100):
24 p = Process(target=f1,args=(i,))
25 p.start()
26 p_list.append(p)
27
28 [pp.join() for pp in p_list]
29 p_e_t = time.time()
30 p_dif_t = p_e_t - p_s_t
31 print('进程池执行时间:',dif_time)
32 print('多进程执行执行时间',p_dif_t)
测试多进程的时间
1 import time
2 from multiprocessing import Process
3
4 def f1():
5 time.sleep(2)
6 print('子进程1号')
7
8 def f2():
9 time.sleep(3)
10 print('字进程2号')
11
12 if __name__ == '__main__':
13
14 s = time.time()
15 p = Process(target=f1,)
16 p2 = Process(target=f2,)
17 p.start()
18 p2.start()
19 p.join()
20 p2.join()
21 e = time.time()
22 print(e - s)
23 print('主进程结束')
进程池同步方法
1 import time
2 from multiprocessing import Process,Pool
3 def f1(n):
4 time.sleep(1)
5 return n
6
7 if __name__ == '__main__':
8 pool = Pool(4)
9 for i in range(10):
10 print('123456')
11
12 # 进程池的同步方法,将任务变成了串行
13 res = pool.apply(f1,args=(i,))
14 print(res)
进程池异步方法
1 import time
2 from multiprocessing import Process,Pool
3 def f1(n):
4 time.sleep(0.5)
5 return n
6
7 if __name__ == '__main__':
8 pool = Pool(4)
9
10 res_list = []
11 for i in range(5):
12 print(123456)
13
14 # 异步给进程池提交任务
15 res = pool.apply_async(f1,args=(i,))
16 res_list.append(res)
17
18 print('等待所有任务执行完')
19
20 # 锁住进程池,不让其他的程序再往这个进程池里面提交任务
21 pool.close()
22 pool.join()
23
24 # 打印结果,如果异步提交之后的结果对象
25 for i in res_list:
26 print(i.get())
进程池的回调函数
1 import os
2 from multiprocessing import Process,Pool
3
4 def f1(n):
5 print('进程池里的进程id:',os.getpid())
6 print(n)
7 return n
8
9 def call_back_func(a):
10 print(os.getpid())
11 print('回调函数中的结果',a)
12
13 if __name__ == '__main__':
14 pool = Pool(4)
15 res = pool.apply_async(f1,args=(5,),callback=call_back_func)
16 pool.close()
17 pool.join()
18 # print(res.get())
19 print('主进程的id:',os.getpid())
20 结果
21 进程池里的进程id: 16632
22 5
23 13392
24 回调函数中的结果 5
25 主进程的id: 13392

浙公网安备 33010602011771号