可爱的 Python: 用 Python 生成器实现“轻便线程”
2007-03-29 12:04:49 来源:WEB开发网核心提示: 结果表明,在直接循环的版本运行一次的时间内,可爱的 Python: 用 Python 生成器实现“轻便线程”(6),轻便线程的版本运行了两次还多一点点 ― 也就相当于在上面提到的机器上,轻便线程运行了不到 3 秒,上面的示例只展示了形式最基本的几个线程调度程序,可能实现的还有很多(这个问题
结果表明,在直接循环的版本运行一次的时间内,轻便线程的版本运行了两次还多一点点 ― 也就相当于在上面提到的机器上,轻便线程运行了不到 3 秒,而直接循环运行了超过 6 秒。显然,如果每个工作单元都相当于单个字符串方法调用的两倍、十倍或一百倍,那么所花费的线程开销比例就相应地更小了。
设计线程
轻便线程可以(而且通常应该)比单独的概念性操作规模更大。无论是何种线程,都是用来表示描述一个特定 任务或 活动所需的流上下文的量。但是,任务花费的时间/大小可能比我们希望在单独线程上下文中使用的要多/大。抢占将自动处理这种问题,不需要应用程序开发者作出任何特定干涉。不幸的是,轻便线程用户需要注意“好好地处理”其它线程。
至少,轻便线程应该设计得足够周全,在完成概念性操作时应该能够 yield 。调度程序将回到这里以进行下一步。举例来说:
清单 4. 伪码友好的轻便线程
def nicethread():
while 1:
...operation A...
yield None
...operation B...
yield None
...operation C...
yield None
多数情况下,好的设计将比在基本操作之间的边界 yield 更多次。虽然如此,通常在概念上“基本”的东西都涉及对一个大集合的循环。如果情况如此(根据循环体耗费时间的程度),在循环体中加入一到两个 yield (可能在特定数量的循环迭代执行过后再次发生)可能会有所帮助。和优先权线程的情况不同,一个行为不良的轻便线程会获取无限量的独占处理器时间。
调度的其它部分
迄今为止,上面的示例只展示了形式最基本的几个线程调度程序。可能实现的还有很多(这个问题与设计一个好的生成器/线程没什么关系)。让我来顺便向您展示几个传送中可能出现的增强。
更多精彩
赞助商链接