2012-05-25 56 views
0

我遇到了問題。 這樣吧, 函數正常返回單個結果。我想要的是它在特定時間範圍內返回連續的結果流(可選)。單個函數調用返回連續結果

函數重複返回單個函數調用的結果是否可行?

通過網絡瀏覽時,我遇到了gevent和線程。如果有的話,它會起作用如何解決它?

我只需要調用該函數工作的開展和各項任務完成後立即返回結果。

+0

你可以將函數重新編程爲[generator](http://www.linuxtopia.org/online_books/programming_books/python_programming/python_ch18.html)嗎? –

+0

我不確定我是否完全理解了這個問題。你是否在尋找某種非阻塞的函數調用,並在函數有一些有趣的事情來通知調用者時得到通知? – Vikas

+0

閱讀['yield'](http://docs.python.org/reference/simple_stmts.html#yield)和[coroutines](http://en.wikipedia.org/wiki/Coroutine)。 – phg

回答

0

你GEVENT和線程在正確的軌道上,因爲一個函數做什麼編程做,要麼接受每次1個變種或採取一組並返回或者一組或一個變種。該函數被調用返回無論結果和處理的連續流可能發生已經要不你問一個遍歷內核指針或類似的東西,你都沒有,所以...

所以,你調用代碼,它封裝你的函數是很重要的,功能,任何功能,例如,即使是真/假布爾函數只執行,直到它與它的增值經銷商完成的,所以MUSE是監聽無限通話功能在你的情況。如果它不存在,你應該寫一個;)

它封裝調用的代碼肯定是非常重要的。

人們沒有足夠的信息來幫助我們,除非我們可以告訴你,你是或者應該在某個框架的事件循環中,或者其他代碼的某些形式的循環已經存在,這就是你想要爲之收聽/準備數據。

對於這類事情,我喜歡「函數式編程」,「地圖函數」。我認爲。我不能評論我的代表級別,或者我會限制我的猜測。 :)

要從另一個人獲得更好的答案發布一些示例代碼並儘可能地顯示您的API。

0

爲什麼需要這不是在問題中指定,所以很難知道你需要什麼,但我會給你一個總體思路和代碼了。

你可以返回以這種方式:return var1, var2, var3(但是這不是你需要什麼,我認爲)

你有多種選擇:要麼阻塞或非阻塞。阻塞意味着您在調用函數時不再執行代碼。非阻塞意味着它將並行運行。你也應該知道你一定需要修改調用該函數的代碼。

,如果你想在一個線程(非阻塞)這就是:

def your_function(callback): 
    # This is a function defined inside of it, just for convenience, it can be any function. 
    def what_it_is_doing(callback): 
     import time 
     total = 0 
     while True: 
      time.sleep(1) 
      total += 1 
      # Here it is a callback function, but if you are using a 
      # GUI application (not only) for example (wx, Qt, GTK, ...) they usually have 
      # events/signals, you should be using this system. 
      callback(time_spent=total) 

    import thread 
    thread.start_new_thread(what_it_is_doing, tuple(callback)) 

# The way you would use it: 
def what_I_want_to_do_with_each_bit_of_result(time_spent): 
    print "Time is:", time_spent 

your_function(what_I_want_to_do_with_each_bit_of_result) 
# Continue your code normally 

其他選項(阻塞)涉及一種特殊的這些迭代器在技術上處理功能generators。所以你將它定義爲一個函數並充當迭代器。這是一個例子,使用相同的虛擬功能,其中一個比另一個:

def my_generator(): 
    import time 
    total = 0 
    while True: 
     time.sleep(1) 
     total += 1 
     yield total 

# And here's how you use it: 
# You need it to be in a loop !! 
for time_spent in my_generator(): 
    print "Time spent is:", time_spent 

# Or, you could use it that way, and call .next() manually: 
my_gen = my_generator() 
# When you need something from it: 
time_spent = my_gen.next() 

注意,在第二個例子中,代碼將毫無意義,因爲它是不是真的叫每隔1秒,其原因在於其他代碼每次運行yield或調用.next時,可能需要一些時間。但我希望你明白這一點。

同樣,這取決於你在做什麼,如果你使用的應用程序有一個「事件」框架或類似的你需要使用它,如果你需要它阻塞/非阻塞,如果時間很重要,你的調用代碼如何操縱結果...

相關問題