3

我对 Stackless Python 的 tasklet 进行了大量的谷歌研究。每个来源都提到它作为一个线程

stackless.com:微线程:tasklet 包装函数,允许它们作为微线程启动。

disinterest.orgv:Tasklets——轻量级线程

但是tasklet不是并发的。他们逐部分执行代码。

像这样的代码:

def function(n):
   print n
   print n
   stackless.schedule()

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()

将打印

3
3
10
10

tasklet 执行代码,直到遇到 stackless.schedule() 然后它从开始或从上次暂停的地方执行下一个 tasklet。

每个程序员都知道“无 GOTO”的黄金法则。我的问题是:

这和 GOTO 有什么不同?
如果不并行执行,使用 tasklet 有什么好处?
如果它们不是真正的线程,为什么每个消息来源都提到它们作为线程替代品?

4

2 回答 2

7

它与 goto 有何不同?

这与 goto 的不同之处在于您没有指定要去哪里。通过产生你的tasklet(调用stackless.schedule()),你所说的只是“我现在完成了;你可以稍后再找我”而不是“从文件x的第n行开始执行”。“goto 不好”的建议源于这样一个事实,即它允许您编写意大利面条式代码,而您的程序的执行是不可能遵循的。另一方面,小任务(或协程)在这方面要好得多,因为您知道每个小任务都会运行到完成。

如果不并行执行,使用 tasklet 有什么好处?

并发不同于并行。并行性是指两个任务实际上同时运行。并发是指两个任务在执行过程中可以重叠,但它们不一定都在完全相同的时刻运行。Tasklet 是并发的,但不是并行的。tasklet 的优势基本上是并发性。

如果它们不是真正的线程,为什么每个消息来源都提到它们作为线程替代品?

如果您可以放弃并行性,它们是线程的替代品,以获得更低的开销。它们仍然是线程,因为它们仍然允许多个并发执行路径,即使它们不是严格并行的。

于 2014-04-03T23:35:22.370 回答
2

我看不出这与 goto 想象以下内容有何相似之处。

def Eat():
   while True:
        do_something()
        stackless.schedule()
def Play():
   while True:
        do_another_thing()
        stackless.schedule()

def Sleep():
    while True:
        do_something_else()
        stackless.schedule()

stackless.tasklet(Eat)()
stackless.tasklet(Play)()
stackless.tasklet(Sleep)()

它本质上是单核线程,每个线程都可以决定何时放弃对另一个等待任务的控制

它与实时操作系统如何实现任务调度非常相似

于 2014-04-03T23:36:18.377 回答