This link has been bookmarked by 5 people . It was first bookmarked on 10 Jun 2008, by Tom Liu.
-
08 Jan 09
-
2.1 微进程(tasklet)
-
Python可调用对象(通常为函数或类的方法)来建立它,这将建立一个微进程并将其添加到调度器
-
微进程是stackless的基本构成单元
-
stackless.run()
-
微进程将排起队来,并不运行,直到调用 stackless.run()
-
stackless.schedule()
-
并将自身重新插入到调度器队列的末尾
-
一旦在它前面的所有其他微进程都运行过了,它将从上次停止的地方继续开始运行。这个过程会持续,直到所有的活动微进程都完成了运行过程。这就是使用stackless达到合作式多任务的方式。
-
当调用 stackless.schedule() 的时候,当前活动微进程将暂停执行,
-
通道使得微进程之间的信息传递成为可能
-
- 能够在微进程之间交换信息。
- 能够控制运行的流程。
-
channel = stackless.channel()
-
channel.receive()
-
channel.send("send from sending_tasklet")
-
接收的微进程调用 channel.receive() 的时候,便阻塞住,
-
这意味着该微进程暂停执行,直到有信息从这个通道送过来。
-
若有其他微进程向这个通道发送了信息,则不管当前的调度到了哪里,这个接收的微进程都立即恢复执行;而发送信息的微进程则被转移到调度列表的末尾
-
发送信息的时候,若当时没有微进程正在这个通道上接收,也会使当前微进程阻塞
-
发送信息的微进程,只有在成功地将数据发送到了另一个微进程之后,才会重新被插入到调度器中
-
它导致了堆栈溢出。如果运行这个程序,它将显示一大堆讨厌的跟踪信息,来指出堆栈空间已经耗尽。
-
每当一个子例程被调用,都有一个“栈帧”被建立,这是用来保存变量,以及其他子例程局部信息的区域。
-
在大多数情况下,当每个子例程返回的时候,其栈帧将被清除掉,就是说堆栈将会自行实现清理过程。
-
在C语言中,堆栈就是一个不需要编程者来手动进行内存管理的区域。
-
你可以运行这个程序要多久有多久,它都不会崩溃,且如果你检查其内存使用量(使用Windows的任务管理器或Linux的top命令),将会发现使用量是恒定的。这个程序的协程版本,不管运行一分钟还是一天,使用的内存都是一样的。而如果你检查原先那个递归版本的内存用量,则会发现其迅速增长,直到崩溃。
-
与当今的操作系统中内建的、和标准Python代码中所支持的普通线程相比,“微线程”要更为轻量级,正如其名称所暗示。它比传统线程占用更少的内存,并且微线程之间的切换,要比传统线程之间的切换更加节省资源。
-
-
17 Oct 08
-
24 Feb 08
-
17 Dec 07
Would you like to comment?
Join Diigo for a free account, or sign in if you are already a member.