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

 

posted @ 2019-01-10 17:30  LinuxCBB  阅读(689)  评论(0)    收藏  举报