2013-04-02 57 views
2

問題來了,當我開始使用concurrent.futures模塊這樣的對象上實現異步set和get操作:將Python期貨用於沒有結果的任務是一個好主意嗎?

import time 
from concurrent.futures import ThreadPoolExecutor 

executor = ThreadPoolExecutor(max_workers=2) 

class Foo(object): 
    def set_something(self): 
     def long_running_setter(): 
      time.sleep(1.5) 
      print('Set something') 
     return executor.submit(long_running_setter) 

    def get_something(self): 
     def long_running_getter(): 
      time.sleep(0.5) 
      return 'something' 
     return executor.submit(long_running_getter) 

foo = Foo() 
future = foo.get_something() 
print("Got " + future.result()) 

但現在,設定值,並等待它變得有點彆扭使用和語義「不正確」

​​

雖然我覺得這是仍然有效,因爲Foo對象處於最低水平,進一步抽象可能對期貨的頂部之上。

所以,總結一下我的問題:

  • 期貨是一種權利抽象的從對象的get/set值異步?特別是對於不返回任何價值的setter?
  • 我是否應該爲set_something添加blocking參數以擺脫result()調用?我對這種方法有懷疑,因爲那樣我就會鼓勵不要使用期貨。
  • 你會怎麼做?

回答

0

如果在繼續超過代碼中的某個點之前必須完成該操作,則需要某種方法來阻止/加入/等待。

Python properties比Java風格的getter和setters(比如obj.get_xobj.set_x)更受歡迎。由於屬性僞裝成常規屬性,因此由屬性觸發異步代碼會是一種糟糕的風格。

許多人發現面向對象使用異步代碼時會遇到麻煩,他們更喜歡使用更實用的風格。幸運的是,Python支持使用任何編程範例。

相關問題