将Python期货用于没有结果的任务是一个好主意吗?

时间:2013-04-02 07:27:18

标签: python asynchronous future concurrent.futures

当我开始使用concurrent.futures模块对对象进行异步集和获取操作时出现了问题:

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.set_something().result()

虽然我认为它仍然有效,因为Foo对象处于最低级别,并且可以在期货之上构建更多抽象。

所以,总结一下我的问题:

  • 期货是从对象异步获取/设置值的正确抽象方式吗?特别是对于没有返回任何价值的制定者?
  • 我应该向blocking添加set_something参数,以便摆脱result()来电吗?我对这种方法表示怀疑,因为那时我鼓励不要使用期货。
  • 你会怎么做?

1 个答案:

答案 0 :(得分:0)

如果必须先完成操作才能继续超过代码中的某个点,则需要某种方法来阻止/加入/等待。

Python properties比Java风格的getter和setter(如obj.get_xobj.set_x)更受欢迎。因为属性伪装成常规属性,所以由属性触发异步代码是不好的风格。

许多人发现面向对象会让他们遇到异步代码的麻烦,他们更喜欢使用更实用的样式。幸运的是,Python支持使用任何一种编程范例。