循环执行一个线程
# -*- 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()