前几天刷视频看到真传一句话, 假传万卷书
, 我深以为是, 因为自己平时学习的时候也是这种感觉, 各种教程唧唧歪歪, 罗里吧嗦的一大堆, 就是不告诉你核心的内容, 这个时候就造成
不会的看了一遍头昏眼花, 会的看了一遍浪费了大把时间
.
之后我写博客, 都会贯彻这一个思想, 用最简单的例子把东西讲出来, 以这次线程池为例.
- 任务类, 它用来包装我们需要执行的方法, 以及方法的参数, 如下
class WorkMission(object):
def __init__(self, _func, _args):
self._func = _func
self._args = _args
def execute(self):
self._func(*self._args)
# 下面是测试例子, 为了好理解这个任务类到底是什么意思
def print_str(str1, str2):
print threading.current_thread().ident, str1, str2
x = WorkMission(print_str, (i, -i))
x.execute()
- 执行类, 执行类本身继承threading.Thread, 是一个执行任务类的执行者, 如下
import threading
class Worker(threading.Thread):
def __init__(self, _request_queue):
super(Worker, self).__init__()
# _request_queue是线程池传过来的任务队列, 类型是Queue, 是线程安全的
# 里面装的是任务类的实例
self._request_queue = _request_queue
def run(self):
# run是线程的启动方法, 这里自我循环是因为此线程并不是执行完一个任务类就行了
# 而是要一直去获取任务队里的任务, 一有任务就去执行
while True:
work_mission = self._request_queue.get()
work_mission.execute()
- 线程池类
import Queue
class ThreadPool(object):
def __init__(self, thread_number):
self.works = None
# 任务队列, 里面装任务类, 线程安全的
self._request_queue = Queue.Queue()
self.create_works(thread_number)
def create_works(self, thread_number):
# 创建thread_number个线程, 并且启动, 因为在线程类里, run是进行循环的, 所以不会立即结束
self.works = [Worker(self._request_queue) for i in range(thread_number)]
for w in self.works:
w.start()
def put_mission(self, _mission):
assert isinstance(_mission, WorkMission)
# 将任务放进任务队列
self._request_queue.put(_mission)
def wait(self):
# 这里是等待所有的任务都执行之后(没有说执行完毕哈), 就是执行类把任务全都get之后, 就继续往下走
while not self._request_queue.empty():
pass
- 测试
def print_str(str1, str2):
# 打印自己的线程id, 和两个参数
print threading.current_thread().ident, str1, str2
p = ThreadPool(10)
for i in range(10):
p.put_mission(WorkMission(print_str, (i, -i)))
p.wait()
思考题:
- 这样执行完毕之后, 会发现, 程序并没有结束, 那么是在干什么呢?
其实主线程已经结束了, 但是几个执行类还在run方法里面自我循环, 有什么方法能让任务执行完毕之后, 执行类都退出呢? 希望能在评论区给出答案