future与线程池

目录

一、future

二、future作用

三、future的基本结构

四、线程池的工作

五、线程的工作

六、主线程的工作

七、过程解析

第一段是处理时间的工具类:

第二段是我们的牌牌(future)

第三段是我们的厨师

第四段是线程池


一、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
发布了46 篇原创文章 · 获赞 75 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38875300/article/details/82744768