潭州课堂25班:Ph201805201 并发(进程与线程池) 第十四课 (课堂笔记)
循环执行一个线程
# -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/7/20 0020 5:35 import threading import queue import time class my_th(threading.Thread): def __init__(self): super().__init__() self.daemon = True # 守护模型(主线程结束,所有子线程结束) self.queue = queue.Queue() def run(self): while True: fun = self.queue.get() # 得到函数对象, fun() # 运行函数 self.queue.task_done() # 队列中有任务,会不断的依次运行, def appy(self,fun): # 添加任务 self.queue.put(fun) def join(self, timeout=None): # 重写 join 方法 self.queue.join() # 把队列的 join 方法写在里边 # 当队列任务执行完毕就结, def fun_1(): time.sleep(2) print('aaaa') t = my_th() t.start() t.appy(fun_1) t.appy(fun_1) t.appy(fun_1) t.appy(fun_1) t.join() # 这里的 join 不是等待线程,而是等待队列任务执行完 # 始终只有一个线程在运行,
上边是任务有多个,但线程池中只有一个线程,2秒打印一个,
自定义线程池
# -*- coding: utf-8 -*- # 斌彬电脑 # @Time : 2018/7/20 0020 5:35 import threading import queue import time class my_th(threading.Thread): def __init__(self,num): super().__init__() self.queue = queue.Queue() for i in range(1,num+1): t = threading.Thread(target=self.run, name='thread_{}'.format(i)) t.daemon = True t.start() def run(self): while True: fun = self.queue.get() # 得到函数对象, fun() # 运行函数 self.queue.task_done() # 队列中有任务,会不断的依次运行, def appy(self,fun): # 添加任务 self.queue.put(fun) def join(self, timeout=None): # 重写 join 方法 self.queue.join() # 把队列的 join 方法写在里边 # 当队列任务执行完毕就结, def fun_1(): time.sleep(2) print('aaaa') t = my_th(5) # () 创建线程个数, t.appy(fun_1) t.appy(fun_1) t.appy(fun_1) t.appy(fun_1) t.appy(fun_1) t.appy(fun_1) t.join() # 这里的 join 不是等待线程,而是等待队列任务执行完
进程池
# import multiprocessing # from multiprocessing import Pool # py自带的进程池 import time from multiprocessing.dummy import Pool # 线程池 from multiprocessing.pool import ThreadPool # 线程池 pool = Pool(4) # 实例池,他的大小默认是 cpu 核心个数 def func(i): print('..............',i) time.sleep(0.1) if __name__ == '__main__': for i in range(10): pool.apply_async(func=func,args=(i,)) # 向池提交任务 # pool.map(func,range(5)) # 与 pool.apply_async pool.close() # 关闭池 pool.join() # 等待任务完毕
# pool.terminate()
如果池中有返回值:
# import multiprocessing # from multiprocessing import Pool # py自带的进程池 import time from multiprocessing.dummy import Pool # 线程池 from multiprocessing.pool import ThreadPool # 线程池 pool = Pool(4) # 实例池,他的大小默认是 cpu 核心个数 def func(i): print('..............',i) time.sleep(0.1) return i if __name__ == '__main__': a = [] for i in range(10): p = pool.apply_async(func=func,args=(i,)) # 向池提交任务 a.append(p.get()) # pool.map(func,range(5)) # 与 pool.apply_async pool.close() # 关闭池 pool.join() # 等待任务完毕 for i in a: print(i) # pool.terminate()