2013-04-02 20 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支持使用任何编程范例。

相关问题