2

マルチスレッドを利用するために、チェリーピーサーバーでボトルを使用しています。私が理解しているように、これにより、各リクエストが異なるスレッドによって処理されます。したがって、次のコードが与えられます。

from bottle import request, route

somedict = {}

@route("/read")
def read():
  return somedict


@route("/write", method="POST")
def write():
  somedict[request.forms.get("key")] = request.forms.get("value")

somedict はスレッドセーフでしょうか? somedict を管理するためにデーモン スレッドが実行された場合、それがアクティブなセッションの辞書であり、デーモン スレッドが期限切れのセッションをプルーニングするとします。そうでない場合は、単純なロック機構で十分であり、読み取り、書き込み、およびデーモンスレッドで、またはデーモンスレッドでのみ使用する必要がありますか?

また、私が理解しているように、cherrypy は真のマルチスレッド サーバーです。Pythonsスレッドは真のスレッドではないため、cherrypyを使用しているときにデーモンスレッドを実装するために使用する必要があるより適切な方法はありますか? ただし、このプロジェクトではボトルに固執することを好むチェリーピー環境をあまり掘り下げたくないので、ボトルから離れたり、アプリをチェリーピーに移行したりする場合は、今のところ問題ありません。スレッドに関するドキュメントにはあまり見られなかったので、まだ知りたいです。

4

3 に答える 3

1

あなたの特定の例では、はい、実行する(単一の)dict割り当てはスレッドセーフです。

somedict[request.forms.get("key")] = request.forms.get("value")

しかし、より一般的には、あなたの質問に対する適切な答えは、実際にはロック機構を使用する必要があるということです。これは、たとえば、単一のリクエストを処理しながら somedict に複数の更新を行い、それらをアトミックに行う必要がある場合に当てはまります。

良いニュースは: おそらくミューテックスと同じくらい簡単です:

from bottle import request, route
import threading

somedict = {}
somedict_lock = threading.Lock()

@route("/read")
def read():
    with somedict_lock:
        return somedict

@route("/write", method="POST")
def write():
    with somedict_lock:
        somedict[request.forms.get("key1")] = request.forms.get("value1")
        somedict[request.forms.get("key2")] = request.forms.get("value2")
于 2013-11-09T20:44:28.493 に答える
0

CherryPy は Python スレッドに基づいているため、HTTP サーバーのみ (およびその他のネイティブ HTTP サーバー) として使用することは避けてください。マルチプロセスであり、GILの問題がないuWSGIを使用することをお勧めします。マルチプロセスであるため、単純なスレッド共有変数を使用することはできません。ただし、uWSGI の SharedArea またはサードパーティのデータ ストレージを使用できます。

于 2013-11-09T17:21:33.203 に答える