可爱的 Python: 用 Python 生成器实现“轻便线程”
2007-03-29 12:04:49 来源:WEB开发网这大概就是您能够选择的最简单的轻便线程调度程序了。每个线程都按固定顺序进入,而且每个线程都有同样的优先级。接下来,让我们来看看如何处理细节问题。和前面部分所讲的协同程序一样,编写轻便线程时应该遵守一些约定。
处理细节
大多数情况下,轻便线程的生成器都应该包括在 while 1: 循环中。这里设置调度程序的方法将导致在其中一个线程停止时整个调度程序停止。这在某种意义上“健壮性”不如 OS 线程 ― 不过在 scheduler() 的循环 内捕获异常不会比在循环外需要更多的机器资源。而且,我们可以从 threads 列表删除线程,而不必终止(由它本身或其它线程终止)。我们其实并没有提供让删除更加容易的详细方法;不过比较常用的扩展方法可能是将线程存储在字典或某种其它的结构中,而不是列表中。
该示例说明了最后终止调度程序循环的一种合理的方法。 quitter() 是一种特殊的生成器/线程,它监视某种条件(在本示例中只是一个上下文切换的计数),并在条件满足时抛出 StopIteration (本示例中不捕获其它异常)。请注意,在终止之后,其它所有生成器还是完整的,如果需要,还可以在今后恢复(在微线程调度程序或其它程序中)。显然,如果需要,您可以 delete 这些生成器/线程。
这里讨论的示例使用了特殊的无意义线程。它们什么也不做,而且以一种可能性最小的形式实现这一点。我们这样建立该示例是为了说明一点 ― 轻便线程的内在开销是非常低的。在一台比较老的只有 64 MB 内存的 Windows 98 Pentium II 膝上型电脑上创建 100,000 个轻便线程是轻而易举的(如果达到了一百万个线程,就会出现长时间的磁盘“猛转”)。请用 OS 线程试试看!而且,在这个比较慢的 366 MHz 芯片上可以在大约 10 秒内执行一百万次上下文切换(所涉及的线程数对耗时并无重大影响)。显然,真正的轻便线程应该 做一些事情,而这将根据任务使用更多的资源。不过线程本身却赢得了“轻便”的名声。
更多精彩
赞助商链接