#上节多线程内容回顾#多线程的使用场景 #多进程的基本使用

  

 1 #上节多线程内容回顾
 2 
 3 
 4 进程 至少包含一个 线程
 5 
 6 线程 内存共享
 7 线程同时修改同一份数据时必须加锁,mutex互斥锁
 8 递归锁
 9 join 等待一个线程结束
10 
11 #串行
12 def run():
13     print ('run thread...')
14 
15 for i in range(10):  #串行
16     t = threading.Thread(target=run,args=(n,))
17     t.start()
18     t.join()
19 
20 
21 #并行方法
22 def run():
23     print ('run thread...')
24 
25 t_res = []
26 
27 for i in range(10):  
28     t = threading.Thread(target=run,args=(n,))
29     t.start()
30     t_res.append(t)
31 
32 for r in t_res:
33     r.join()
34 
35 
36 
37 守护线程(slave)  服务于非守护线程(master)
38 
39 
40 #守护线程
41 def run():
42     print ('run thread...')
43 
44 for i in range(10):  
45     t = threading.Thread(target=run,args=(n,))
46     t.setDaemon(True)
47     t.start()
48     
49 print ('master is done...')
50 
51 
52 
53 queue队列
54     解耦,使程序直接实现松耦合,
55     提高处理效率,
56 
57     FIFO = first in first out   先进先出
58     LIFO = last in first out    后进先出
59         
60    
#上节多线程内容回顾

  

 1 #多线程的使用场景 #多进程的基本使用
 2 
 3 
 4 #io 操作不占用CPU (读取数据)
 5 
 6 #计算占用CPU , 1+1
 7 
 8 #python的多线程,不适合CPU密集操作型的任务,适合IO操作密集型的任务
 9 
10 '''
11 import multiprocessing
12 import time
13 
14 from multiprocessing import Process
15 
16 def f(name):
17     time.sleep(2)
18     print('hello', name)
19  
20 if __name__ == '__main__':
21     p = Process(target=f, args=('bob',))
22     p.start()
23     p.join()
24 
25 '''
26 
27 
28 
29 '''
30 import multiprocessing
31 import time
32 
33 def run(name):
34     time.sleep(2)
35     print('hello', name)
36  
37 if __name__ == '__main__':
38     for i in range(10):
39         p = multiprocessing.Process(target=run, args=('bob %s' %i,))
40         p.start()
41 
42 
43 '''
44 '''
45 import multiprocessing
46 import time
47 import threading
48 
49 def thread_run():
50     print (threading.get_ident())
51 def run(name):
52     time.sleep(2)
53     print('hello', name)
54     t = threading.Thread(target=thread_run,)
55     t.start()
56     
57 if __name__ == '__main__':
58     for i in range(10):
59         p = multiprocessing.Process(target=run, args=('bob %s' %i,))
60         p.start()
61 
62 '''
#多线程的使用场景 #多进程的基本使用

 

 1 #get 进程ID
 2 
 3 from multiprocessing import Process
 4 import os
 5  
 6 def info(title):
 7     print(title)
 8     print('module name:', __name__)
 9     print('parent process:', os.getppid())
10     print('process id:', os.getpid())
11     print("\n\n")
12  
13 def f(name):
14     info('1mcalled from child process function f')
15     print('hello', name)
16  
17 if __name__ == '__main__':
18     info('1mmain process line')
19     p = Process(target=f, args=('bob',))
20     p.start()
21     p.join()
#get 进程ID

 

  1 #进程间数据交互#进程同步#进程池的使用 (信号量)
  2 
  3 #进程间通讯 
  4 #不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法:
  5 
  6 #Queues使用方法跟threading里的queue差不多
  7 
  8 '''
  9 #Queues  使用方法跟threading里的queue差不多
 10 from multiprocessing import Process, Queue
 11  
 12 def f(q):
 13     q.put([42, None, 'hello'])
 14  
 15 if __name__ == '__main__':
 16     q = Queue()
 17     p = Process(target=f, args=(q,))
 18     p.start()
 19     print(q.get())    # prints "[42, None, 'hello']"
 20     p.join()
 21 
 22 '''
 23 
 24 
 25 
 26 '''
 27 #Pipes方法
 28 
 29 from multiprocessing import Process, Pipe
 30  
 31 def f(conn):
 32     conn.send([42, None, 'hello'])
 33     conn.close()
 34  
 35 if __name__ == '__main__':
 36     parent_conn, child_conn = Pipe()
 37     p = Process(target=f, args=(child_conn,))
 38     p.start()
 39     print(parent_conn.recv())   # prints "[42, None, 'hello']"
 40     p.join()
 41 
 42 '''
 43 '''
 44 #Managers方法 默认加锁
 45 
 46 from multiprocessing import Process, Manager
 47 import os
 48 
 49 
 50 def f(d, l):
 51     d[1] = '1'
 52     d['2'] = 2
 53     d[0.25] = None
 54     l.append(os.getpid())
 55     print(l)
 56  
 57 if __name__ == '__main__':
 58     with Manager() as manager:
 59         d = manager.dict()#生成一个字典,可在多个进程间共享和传递
 60         l = manager.list(range(5))#生成一个列表,可在多个进程间共享和传递
 61         p_list = [] #用来存放等待全部进程的列表
 62         for i in range(10):
 63             p = Process(target=f, args=(d, l))
 64             p.start()
 65             p_list.append(p)
 66         for res in p_list:#等待结果
 67             res.join()
 68  
 69         print(d)
 70         print(l)
 71 '''
 72 '''
 73 #Managers方法 默认加锁
 74 
 75 from multiprocessing import Process, Manager
 76 import os
 77 
 78 def f(d, l):
 79     d[os.getpid()] = os.getpid()
 80     l.append(os.getpid())
 81     print(l)
 82  
 83 if __name__ == '__main__':
 84     with Manager() as manager:
 85         d = manager.dict()#生成一个字典,可在多个进程间共享和传递
 86         l = manager.list(range(5))#生成一个列表,可在多个进程间共享和传递
 87         p_list = [] #用来存放等待全部进程的列表
 88         for i in range(10):
 89             p = Process(target=f, args=(d, l))
 90             p.start()
 91             p_list.append(p)
 92         for res in p_list:#等待结果
 93             res.join()
 94  
 95         print(d)
 96         print(l)
 97 '''
 98 '''
 99 #进程同步
100 
101 from multiprocessing import Process, Lock
102  
103 def f(l, i): #锁,值
104     #l.acquire()
105     print('hello world', i)
106     #l.release()
107  
108 if __name__ == '__main__':
109     lock = Lock()
110     for num in range(10):
111         Process(target=f, args=(lock, num)).start()
112 
113 '''
114 '''
115 
116 from multiprocessing import Process, Lock
117  
118 def f(l, i): #锁,值
119     l.acquire()
120     try:
121         print('hello world', i)
122     finally:
123         l.release()
124  
125 if __name__ == '__main__':
126     lock = Lock()
127  
128     for num in range(10):
129         Process(target=f, args=(lock, num)).start()
130 
131 '''
132 
133 #进程池的使用 (信号量)
134 
135 #进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,
136 #   如果进程池序列中没有可供使用的进进程,那么程序就会等待,
137 #   直到进程池中有可用进程为止。
138 #   进程池中有两个方法:
139 #apply         #串行
140 #apply_async   #并行
141 
142 '''
143 
144 from  multiprocessing import Process,Pool
145 import time
146  
147 def Foo(i):
148     time.sleep(2)
149     return i+100
150  
151 def Bar(arg):
152     print('-->exec done:',arg)
153  
154 pool = Pool(5)
155  
156 for i in range(10):
157     pool.apply_async(func=Foo, args=(i,),callback=Bar)
158     #pool.apply(func=Foo, args=(i,))
159  
160 print('end')
161 pool.close()
162 pool.join()#进程池中进程执行完毕后再关闭,如果注释,那么程序直接关闭。
163 
164 '''
165 
166 from  multiprocessing import Process,Pool,freeze_support
167 import time
168 import os
169  
170 def Foo(i):
171     time.sleep(2)
172     print('in process',os.getpid())
173     return i + 100
174  
175 def Bar(arg):
176     print('-->exec done:',arg,os.getpid())
177     
178 if __name__ =='__main__':
179     #freeze_support()
180     pool = Pool(processes=3) #允许进程池同时放入5个进程
181     print ('主进程',os.getpid())
182     for i in range(10):
183         pool.apply_async(func=Foo, args=(i,),callback=Bar)#callback回调
184         #pool.apply(func=Foo, args=(i,))#串行
185         #pool.apply_async(func=Foo, args=(i,))#并行
186      
187 print('end')
188 pool.close()#一定要先关闭进程池再join()
189 pool.join()#进程池中进程执行完毕后再关闭,如果注释pool.join(),那么程序直接关闭。
#进程间数据交互#进程同步#进程池的使用 (信号量)

 

posted @ 2017-08-12 09:51  颜言  阅读(155)  评论(0编辑  收藏  举报