目录
一、future
future(期物,流畅的python是这么翻译的)期物是指一种对象,表示已不执行的操作。算了文绉绉的我也不知道
二、future作用
在运行线程的时候,start()完是不能够返回结果的,而future就是用来装载结果
三、future的基本结构
1、get方法:用于返回一个结果。
2、set方法:用于把结果装载到future里面
四、线程池的工作
1、就是生产线程的工厂,不断创建线程。
2、把任务放到任务列表。
五、线程的工作
主要讲run方法:
1、把队列拆包,拆成future,方法
2、方法运行的结果给future
六、主线程的工作
1、新建线程池
2、把function()放到future里面
3、通过future获取结果
比喻是一种更抽象的行为,那让我来把你弄懵吧
七、过程解析
厨师→线程(实际工作),服务员→线程池(等待任务),顾客→主线程(消费),小票(牌牌)→future
第一段是处理时间的工具类:
from enum import Enum
class TimeUnits(Enum):
H = 0
M = 1
S = 2
def converse_time(t, maxtime):
if t == TimeUnits.H:
return maxtime * 60 * 60
elif t == TimeUnits.M:
return maxtime * 60
第二段是我们的牌牌(future)
from time import time
from threa.enum_time import TimeUnits
class my_token:
def __init__(self):
self.menu = None
def get_menu(self, maxtime, time_unit=TimeUnits.S):
if time_unit is not TimeUnits.S:
maxtime = TimeUnits.converse_time(time_unit, maxtime)
t0 = time()
while (self.menu is None):
if time() - t0 >= maxtime:
break
return self.menu
def set_menu(self, result):
self.menu = result
厨师不断地获取任务,假如太长时间都获取不了炒完的菜(线程处理完的结果),那就先继续等待,但是假如要等待的时间太长就证明没有任务可以休息(break)最后当然是返回炒完菜(线程处理完的结果)。那set_menu的作用是什么?暂时把future想象成一个大托盘,上面放炒完的菜,但我就放在托盘(future)上。
第三段是我们的厨师
from threading import Thread
class chef(Thread):
def __init__(self, cook_menus):
Thread.__init__(self)
self.future = None
self.cook_menus = cook_menus
def run(self):
while self.cook_menus is not None:
# 获取future和函数对象,为啥没有执行这个函数对象呢?
#执行是线程执行的,对啊,你现在不就在线程中吗
# 执行过的结果为啥没有放进future?
#menu 就是一个函数啊
future, cook_mennu=self.cook_menus.get()
self.future = future
result = cook_mennu()
self.future.set_menu(result)
print("chif finshing")
cook_menu是一个队列通过get方法pop出第一个元素,元素是元组(future,function)通过运行cook_menu()获得结果,并把结果传给future。就是说厨师炒菜(线程开始处理)炒完的菜给牌牌(future)存着。
第四段是线程池
线程池就相当于waiter,不停调用new_thread()创建线程,服务员(threadpool)当然是负责写菜单啦(put_task,不断把想要的菜放到任务队列里面)我们生成一个牌牌(future)然后存放你要什么菜(cook这是一个对象不要加括号否则就会运行并把结果当参数返回)把task加到队列里面。
import queue
from threa.cheif import chef
from threa.my_token import my_token
class Waiter:
def __init__(self, maxlen=5):
self.chefs = []
self.maxnum = maxlen
self.menus = queue.Queue(10)
self.new_thread()
def put_task(self, cook):
token = my_token()
task = (token, cook)
self.menus.put(task)
return token
"""
def submit(fn):
f = MyFuture()
th = MyThread(fn, f)
th.start()
return f
"""
def new_thread(self):
i = 0
while i < self.maxnum:
chushi = chef(self.menus)
chushi.start()
self.chefs.append(chushi)
i += 1