Python的任务(tasklets)不是违反了“无GOTO”规则吗?

3

我已经进行了大量的谷歌搜索,关于Stackless Python的tasklets。每个来源都将其称为线程。

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

disinterest.orgv: Tasklets — 轻量级线程

但是,tasklets不是并发的。它们逐步执行代码的一部分。

像这样的代码:

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

stackless.tasklet(function)(3)
stackless.tasklet(function)(10)
stackless.run()
将要打印

3
3
10
10

任务单元执行代码,直到遇到stackless.schedule(),然后从头开始或从上次暂停的位置执行下一个任务单元。

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

这与GOTO有何不同?
如果它们不会并行执行,使用任务单元的优点是什么?
为什么每个来源都将它们称为线程的替代品,如果它们实际上并不是线程?

2个回答

7

它与goto语句有何不同?

它与goto语句的不同之处在于,你没有指定你要去哪里。通过yielding你的tasklet(调用stackless.schedule()),你所表达的只是“我现在完成了;稍后可以回到我这里”,而不是“从文件x的第n行开始执行”。"goto是不好的"的建议来自于它允许你编写意大利面式代码,使得程序的执行变得难以跟踪。而tasklets(或协程)在这方面要好得多,因为你知道每个tasklet都会运行到完成。

如果它们不会并行执行,使用tasklets的优势是什么?

并发性和并行性是不同的。并行性是指两个任务实际上同时运行。并发是指两个任务可以在它们的执行中重叠,但它们可能不一定在完全相同的时间运行。Tasklets是并发但不是并行的。Tasklets的优点主要是并发性。

为什么每个来源都将它们称为线程的替代品,即使它们实际上并不是线程?

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


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)()

这实质上是单核线程,在这种情况下,每个线程都可以决定何时放弃控制权以等待另一个任务。

这非常类似于实时操作系统执行任务调度的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,