当我开始使用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()
来电吗?我对这种方法表示怀疑,因为那时我鼓励不要使用期货。答案 0 :(得分:0)
如果必须先完成操作才能继续超过代码中的某个点,则需要某种方法来阻止/加入/等待。
Python properties比Java风格的getter和setter(如obj.get_x
和obj.set_x
)更受欢迎。因为属性伪装成常规属性,所以由属性触发异步代码是不好的风格。
许多人发现面向对象会让他们遇到异步代码的麻烦,他们更喜欢使用更实用的样式。幸运的是,Python支持使用任何一种编程范例。