三十一、Python 进程池和线程池

进程池

进程池中,在不申请进程的时候,不占用内存

进程池内部维护一个进程序列,当使用的时候,则去进程池中获取一个进程。如果进程池序列中没有可以提供使用的进程,那么程序就会等待,知道进程池中有可用进程为止。

2个常用的方法

apply              每一个任务是排队进行:使用进程.join()

apply_async    每一个任务是并发执行,可以设置回调函数,进程无join,进程daemon = True, 主进程不等待子进程。

                    回调函数,将func的返回结果作为函数传递给回调函数

        如果希望apply_async 可以等待所有的子进程结束,需要使用pool.join方法。且前面需要使用pool.close() pool.terminate()

apply

 1 from multiprocessing import Process, Pool
 2 import time
 3 
 4 def Foo(i):
 5     time.sleep(2)
 6     print(i,i+100)
 7     return i+100
 8 
 9 def Bar(arg):  #回调函数
10     print(arg)
11 
12 if __name__ == '__main__':
13     pool = Pool(5)
14     for i in range(2):
15         pool.apply(func= Foo,args = (i,))   #顺序执行,使用了join
16         
17 
18 C:\Python35\python.exe D:/Python0618/homework/day10/a.py
19 0 100
20 1 101

 

apply_async

 1 from multiprocessing import Process, Pool
 2 import time
 3 
 4 def Foo(i):
 5     time.sleep(3)
 6     print(i,i+100)
 7     return i+100
 8 
 9 def Bar(arg):  #回调函数
10     print(arg)
11 
12 if __name__ == '__main__':
13     pool = Pool(5)
14     for i in range(2):
15         pool.apply_async(func= Foo,args = (i,),callback =Bar)   #顺序执行,使用了join
16     pool.close()
17     pool.join()  #进程池中子进程全部执行完毕后在关闭。
19 
20 C:\Python35\python.exe D:/Python0618/homework/day10/a.py
21 0 100
22 1 101
23 100
24 101

 

app_async.get()

get()的作用是得到传递入回调函数的参数。即得到第一个func的 返回值。

from multiprocessing import Process, Pool
import time

def Foo(i):
    time.sleep(1)
    return i+100

def Bar(arg):  #回调函数
    print(arg)

if __name__ == '__main__':
    pool = Pool(5)
    for i in range(2):
        #pool.apply_async(func= Foo,args = (i,),callback =Bar)   #顺序执行,使用了join
        #print(type(pool.apply_async(func= Foo,args = (i,),callback =Bar)))
        print(pool.apply_async(func= Foo,args = (i,),callback =Bar).get())
    pool.close()
    pool.join()



C:\Python35\python.exe D:/Python0618/homework/day10/a.py
100
100
101
101

 

简单线程池

 1 import queue
 2 import time
 3 import threading
 4 
 5 class ThreadPool(object):
 6 
 7     def __init__(self,max_num = 10):
 8 
 9         self.queue = queue.Queue(max_num)
10 
11         for i in range(max_num):
12             self.queue.put(threading.Thread)  #将类名称添加到队列中
13 
14 
15     def get_thread(self):
16         return self.queue.get()
17 
18     def add_thread(self):
19         self.queue.put(threading.Thread)
20 
21 
22 
23 pool = ThreadPool(10)
24 
25 def func(arg,p):
26     print(arg)
27     time.sleep(2)
28     p.add_thread()
29 
30 
31 for i in range(30):
32     thread  = pool.get_thread()     #得到一个线程
33     t = thread(target = func,args=(i,pool))  #在线程执行func函数,同事给线程池添加类名称
34     t.start()

 

posted @ 2016-07-26 19:41  咖啡茶  阅读(102)  评论(0)    收藏  举报