2

concurrent.futures问题出现了,当我开始使用这样的模块在对象上实现异步 set 和 get 操作时:

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()调用吗?我对这种方法持怀疑态度,因为那样我会鼓励根本不要使用期货。
  • 你会怎么做?
4

1 回答 1

0

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

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

许多人发现面向对象让他们在使用异步代码时遇到了麻烦,他们更喜欢使用功能性更强的风格。幸运的是,Python 支持使用任何一种编程范式。

于 2016-08-12T15:55:39.770 回答