python线程池 手动实现

前几天刷视频看到真传一句话, 假传万卷书, 我深以为是, 因为自己平时学习的时候也是这种感觉, 各种教程唧唧歪歪, 罗里吧嗦的一大堆, 就是不告诉你核心的内容, 这个时候就造成
不会的看了一遍头昏眼花, 会的看了一遍浪费了大把时间.
之后我写博客, 都会贯彻这一个思想, 用最简单的例子把东西讲出来, 以这次线程池为例.

  1. 任务类, 它用来包装我们需要执行的方法, 以及方法的参数, 如下
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()
  1. 执行类, 执行类本身继承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()
  1. 线程池类
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
  1. 测试
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()

思考题:

  1. 这样执行完毕之后, 会发现, 程序并没有结束, 那么是在干什么呢?
    其实主线程已经结束了, 但是几个执行类还在run方法里面自我循环, 有什么方法能让任务执行完毕之后, 执行类都退出呢? 希望能在评论区给出答案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值