当前位置: 首页 > SEO学院SEO知识

Python生成器实现微线程编程的教程

来源:未知 浏览量:174次

微线程领域(至少在 Python 中)一直都是 Stackless Python 才能涉及的特殊增强部分。关于 Stackless 的话题以及最近它经历的变化可能本身就值得开辟一个专栏了。但其中简单的道理就是在“新的 Stackless”下左贡县SEO在“新的 Stackless”下延续(continuation)显然是不合时宜的连云区网站优化延续(continuation)显然是不合时宜的但微线程还是这个项目 存在的理由。这一点很复杂……

刚开始我们还是先来回顾一些内容。那么什么是微线程呢? 微线程基本上可以说是只需要很少的内部资源就可以运行的进程 ― 并且是在 Python 解释器的单个实例中(在公共内存空间中连云区网站优化什么是微线程呢? 微线程基本上可以说是只需要很少的内部资源就可以运行的进程 ― 并且是在 Python 解释器的单个实例中(在公共内存空间中等等)运行的进程。有了微线程我们就可能在目前中等性能的 PC 机上运行数以万计的并行进程还可以每秒钟几十万次地在上下文之间切换。对 fork() 的调用或标准的 OS 线程调用根本不能达到这个程度!甚至所谓的“轻量级”线程库中的线程也比这里提出的微线程“重”好几个数量级。

用Python生成器实现微线程编程的教程

轻便线程在某种意义上会令人回想起较早的 Windows 和 MacOS 版本的协作多任务(不过是在单个应用程序中)。然而在另一种意义上轻便线程只不过是在程序中表达流的另一种方式;轻便线程所做的一切(至少在原则上)都可以用“真正庞大的 if/elif 块”技术来完成(蛮干的程序员的黔驴之计)。

一种用简单的生成器模拟协同程序的机制。这个机制的核心部分非常简单。 scheduler() 函数中包装了一组生成器对象这个函数控制将控制流委托给合适的分支的过程。这些协同程序并不是 真正的协同程序因为它们只控制到 scheduler() 函数和来自该函数的分支。不过出于实用的目的您可以用非常少的额外代码来完成同样的事情。 scheduler() 就是类似于下面这样的代码:
清单 1. 模拟协同程序的 Scheduler()

用Python生成器实现微线程编程的教程

新的调度程序

对于轻便线程来说它们的需求与协同程序的需求稍有不同。不过我们还是可以在它的核心处使用 scheduler() 函数。不同之处在于调度程序本身应该决定分支目标而不是从生成器/协同程序接收分支目标。下面让我向您展示一个完整的测试程序和样本:
清单 2. microthreads.py 示例脚本

from __future__ import generators import sys, timethreads = []TOTALSWITCHES = 10**6NUMTHREADS = 10**5def null_factory(): def empty(): while1: yield None return empty() def quitter(): for n in xrange(TOTALSWITCHES/NUMTHREADS): yield None def scheduler(): global threads try : while1: for thread in threads: thread.next() except StopIteration: passif __name__ == "__main__" : for i in range(NUMTHREADS): threads.append(null_factory()) threads.append(quitter()) starttime = time.clock() scheduler() print"TOTAL TIME: " , time.clock()-starttime print"TOTAL SWITCHES:" , TOTALSWITCHES print"TOTAL THREADS: " , NUMTHREADS

这大概就是您能够选择的最简单的轻便线程调度程序了。每个线程都按固定顺序进入而且每个线程都有同样的优先级。接下来让我们来看看如何处理细节问题。和前面部分所讲的协同程序一样编写轻便线程时应该遵守一些约定。

处理细节

展开全部内容