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_somethingresult()
  • どのようにしますか?
4

1 に答える 1

0

コードの特定のポイントを超えて続行する前にアクションを完了する必要がある場合は、何らかの方法でブロック/参加/待機する必要があります。

Pythonプロパティobj.get_xは、Java スタイルの getter および setter (や など)よりもはるかに好まれますobj.set_x。プロパティは通常の属性として偽装されるため、プロパティによってトリガーされる非同期コードを持つのは不適切なスタイルです。

多くの人は、オブジェクト指向が非同期コードで問題を引き起こすことに気づき、より機能的なスタイルを使用することを好みます。幸いなことに、Python はどちらのプログラミング パラダイムの使用もサポートしています。

于 2016-08-12T15:55:39.770 に答える