簡體   English   中英

Python的tasklet是不是違反了沒有“GOTO”的規則?

[英]Aren't Python tasklets breaking the rule of no “GOTO”?

我已經對Stackless Python的tasklets進行了大量的谷歌研究。 每個來源都提到它作為一個主題

stackless.com:Microthreads:tasklets包裝函數允許它們作為微線程啟動。

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,有什么好處?
為什么每個消息來源都提到它們作為線程替代品,如果它們不是真正的線程?

它和goto有什么不同?

這與goto的不同之處在於您沒有指定您要去的地方。 通過讓你的tasklet(調用stackless.schedule() ),你所說的只是“我現在已經完成了;你可以稍后再回到我身邊”,而不是“從文件x的第n行開始執行”。 “goto is bad”的建議源於這樣一個事實:它允許你編寫意大利面條代碼,在那里你的程序執行是不可能的。 另一方面,Tasklets(或協同程序)在這方面要好得多,因為您知道每個tasklet都將運行完成。

如果沒有並行執行tasklet,有什么好處?

並發性與並行性不同。 並行性是兩個任務同時運行的時候。 並發是指兩個任務在執行時可能重疊,但它們可能不一定都在同一時刻運行。 Tasklet是並發的但不是並行的。 tasklets的優點基本上是並發性。

為什么每個消息來源都提到它們作為線程替代品,如果它們不是真正的線程?

如果您可以放棄並行性,它們是線程的替代方案,以便獲得更低的開銷。 它們仍然是線程,因為它們仍然允許多個並發執行路徑,即使它們不是嚴格並行的。

我不知道這是怎樣的類似於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)()

它本質上是單核心線程,每個線程決定何時放棄對另一個等待任務的控制

它與實時操作系統如何實現任務調度非常相似

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM