day10-进程数据共享、进程池

一、进程数据共享

 1 # -----------------------------------------
 2 # 数据传递
 3 from multiprocessing import Process, Pipe
 4 
 5 def f(conn):
 6     # 发送消息给父进程
 7     conn.send([42, None, 'hello'])
 8     conn.send("Just for test")
 9     print(conn.recv())
10     conn.close()
11 
12 if __name__ == '__main__':
13     # 管道生成返回两个实例,双向,角色可调换
14     # 这边把第1个作为父连接,第2个作为子连接
15     parent_conn, child_conn = Pipe()
16     p = Process(target=f, args=(child_conn,))
17     p.start()
18     # 接收子进程的消息
19     print(parent_conn.recv())
20     print(parent_conn.recv())
21     parent_conn.send("from main process")
22     p.join()
23 
24 # -----------------------------------------
25 # 数据共享
26 # manager自动加锁,默认两个进程无法同时修改一份数据
27 from multiprocessing import Process, Manager
28 import os
29 
30 
31 def f(d, l):
32     d[os.getpid()] = os.getpid()
33     l.append(os.getpid())
34     print(l)
35 
36 if __name__ == '__main__':
37     with Manager() as manager:
38         # 声明manager字典
39         d = manager.dict()
40         # 声明manager列表
41         l = manager.list(range(5))
42         p_list = []
43         for i in range(10):
44             # 生成10个进程
45             p = Process(target=f, args=(d, l))
46             p.start()
47             p_list.append(p)
48         # 等待进程结束
49         for res in p_list:
50             res.join()
51         print(d)
52         print(l)

二、进程池

 1 # -------------------------------------------
 2 # 进程锁
 3 from multiprocessing import Process, Lock
 4 
 5 
 6 def f(l, i):
 7     # 加锁
 8     l.acquire()
 9     try:
10         print("hello word", i)
11     finally:
12         # 释放锁
13         l.release()
14 
15 if __name__ == "__main__":
16     # 定义锁
17     lock = Lock()
18     for num in range(10):
19         Process(target=f, args=(lock, num,)).start()
20 
21 # 导入进程池模块pool
22 from multiprocessing import Pool
23 import time, os
24 
25 
26 def Foo(i):
27     time.sleep(2)
28     # 进程号
29     print("in process", os.getpid())
30     return i+100
31 
32 
33 def Bar(arg):
34     print('-->exec done:', arg, os.getpid())
35 
36 if __name__ == "__main__":
37     # 允许进程池同时放入5个进程,给CPU运行
38     pool = Pool(processes=5)
39     for i in range(10):
40         # 同步执行,串行
41         # pool.apply(func=Foo, args=(i,))
42         # 异步执行,并行
43         # pool.apply_async(func=Foo, args=(i,))
44         # callback回调, Foo函数执行完毕之后调用Bar函数,回调函数由主进程调用
45         pool.apply_async(func=Foo, args=(i,), callback=Bar)
46 
47     print('end')
48     pool.close()
49     # 进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
50     pool.join()

 

posted @ 2017-12-20 17:39  不知所以  阅读(87)  评论(0)    收藏  举报