VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • PythonI/O进阶学习笔记_10.python的多线程(5)

 
五. threadpool Future 源码分析
这段源码我是真的很想认真通俗浅显的去分析的。因为在python的多进程和多线程中这个Future的概念是十分常见和重要的。
但是我发现我解释起来太苍白了,还没有直接去看源码来的通俗易懂。就在这放一小段入口的我自己的理解吧。
看完了上面几段笔记,肯定会有这些疑惑:
- submit返回的Future对象到底是啥?
    Future是用来表示task的对象的一个类,很多人称为未来对象,就是这个任务未必现在执行完成了,但是未来是会执行完成的。
    得到了Future对象,能通过其中的属性和方法得到task的状态,是否执行完成等。
    在python的多线程、多进程中,很多地方用到了Future概念。
    具体属性可以去看Class Future中的属性和方法。
 
- 那么Future这个对象是怎么设计的呢?Future怎么知道task的状态改变的呢?
在之前的例子里,我们用ThreadPoolExecutor的submit提交所有的task,返回了Future对象。
那么submit对Future对象的哪些属性进行了哪些处理然后返回,才能让我们得到它的result的呢?
submit的源码:最主要的逻辑是注释了的那几句。
复制代码
def submit(self, fn, *args, **kwargs):
    with self._shutdown_lock:
        if self._broken:
            raise BrokenThreadPool(self._broken)

        if self._shutdown:
            raise RuntimeError('cannot schedule new futures after shutdown')
        if _shutdown:
            raise RuntimeError('cannot schedule new futures after'
                               'interpreter shutdown')

        f = _base.Future()    #初始化一个future对象f
        w = _WorkItem(f, fn, args, kwargs) #实际上是这个_WorkItem把(future对象,执行函数,函数需要的参数)放进去的,并且完成函数的执行,并且设置future的result

        self._work_queue.put(w)       #将w这个task放入 _work_queue队列,会在下面这个方法中,被起的Thread进行调用。
        self._adjust_thread_count()   #调整线程数量,并且初始化线程,开启线程。Thread方法的参数是self._work_queue。起来的线程中执行的task是上两步生成的w队列。
        return f
复制代码


相关教程
关于我们--广告服务--免责声明--本站帮助-友情链接--版权声明--联系我们       黑ICP备07002182号