2017-07-06 42 views
0

假設我想其中有一定的任意程序Bar()Quux()Fizz()程序Foo.py。假設從程序角度來看,通常的執行順序應該是Bar() -> Quux() -> Fizz()。然而,Fizz()應該有條件地在Fizz()功能Buzz()根據一些運行時的行動,並呼籲Buzz()在任何時候都應該返回處理返回至Quux()通過子程序導航的選項有哪些?

我對如何在使用系統調用的彙編中實現併發進程有一個公正的理解,這取決於體系結構,但是我可以在Python中使用哪些選項,而且我不能 - 坦率地說不希望 - 使用大量跳轉並直接移動指令指針?當搜索答案時,我發現循環和遞歸是回到程序中的建議。如果不停止Fizz()進程以等待Buzz()的條件檢查,我不認爲一個循環會起作用,而且我不確定在這種情況下如何實現遞歸。 (我的Buzz()就像一個GUI上的「返回」按鈕)。

+1

看一看[協同程序](http://book.pythontips.com/en/latest/coroutines.html)在python。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ,即將說相同 – Netwave

+0

這太棒了!謝謝。 – ImInfinite313

回答

0

使用協同程序(多線程)將提供所需的併發功能。來自問題和user2357112答案的評論。

1

你不需要任何幻想在這裏。通常的結構化編程工具可以正常工作。有調用BuzzFizz回報,並使其返回一個指標說是否要回去Quux

Bar() 
while True: 
    Quux() 
    if not Fizz(): 
     break 

(如果Buzz的唯一作用應該是返回執行,以Quux,沒有Buzz在所有的,只是返回。)

+0

簡單,我喜歡。但也許它不能正常工作取決於什麼計算應該不在函數上。 – Netwave

+0

這是整潔的,但是這不會需要一個明確的條件檢查,因此一個進程停止,在'Fizz'期間返回到'Quux'? – ImInfinite313

+0

@ ImInfinite313:您將不得不解釋「process stop」的含義。你*想*嘶嘶聲停下來,不是嗎?如果您正在考慮分支錯誤預測和管道沖洗等問題,或者您想要多線程併發執行,那麼您需要更清楚一點。 – user2357112

0

也許像流動的下方。 Fizz循環,直到某些情況喚起對Buzz的呼叫。觸發呼叫的相同檢查會打破循環。

import random 

def Buzz(): 
    print ("Buzz") 

def Fizz(): 
    print ("Fizz") 
    while True: 
     flip = random.random() 
     print (" ", flip) 
     if flip <= 0.5: 
      Buzz() 
      break 

def Quux(): 
    print ("Quux") 
    Fizz() 
    print ("Back in Quux") 

def Bar(): 
    print ("Bar") 
    Quux() 

Bar() 

輸出:

Bar 
Quux 
Fizz 
    0.88313135192614 
    0.9782005471906149 
    0.6899740417799126 
    0.724911154764598 
    0.6193573809551899 
    0.3713918176393549 
Buzz 
Back in Quux