私はdjangoアプリに取り組んでおり、サーバーとしてcherrypyを使用しています。Cherrypy は、ページ ビューごとに新しいスレッドを作成します。これらのスレッド (django との対話を担当するスレッド) のすべてに、それらのいずれかからアクセスできるようにしたいと考えています。より具体的には、これらのスレッドのいずれかから、これらの各スレッドの thread_data にアクセスできるようにしたいと考えています。これは可能ですか?もしそうなら、どうすればいいですか?
2 に答える
CherryPy の wsgiserver は、リクエストごとに新しいスレッドを作成するのではなく、プールを使用します。これらの各ワーカー スレッドは、threading.Thread のサブクラスであるため、threading.enumerate() を介してすべてにアクセスできる必要があります。
ただし、cherrypy.thread_data について具体的に話している場合、それは別のものです: threading.local. 最近のバージョンの Python を使用している場合、すべてが C でコーディングされており、(おそらく当然のことながら) Python からスレッド間でアクセスすることはできません。本当に必要で、自分が何をしているのかを本当に理解している場合、通常、最善の方法は、それらが thread_data 構造に挿入されると同時に、そのようなものへの追加の参照をグローバル コンテナーに貼り付けることです。これらのグローバル コンテナーのキーとして、weakrefs を含む dict をお勧めします。それらを接続プールに使用する Python ORM は十分にあるため (たとえば、私の Geniusql を参照してください)、それらを実装する方法をかなり簡単に学習できるはずです。
このような質問に対する私の最初の回答は、その方法を説明することではなく、これを進める前に本当に再考する必要があることを強調することです. 私は通常、マルチプロセスまたは非同期ソリューションを支持して、スレッド化された Web サーバーを敬遠します。明示的なスレッド間通信をミックスに追加すると、これらの懸念が高まるだけです。
このような問いかけには、より深いゴールがあります。スレッド間通信で解決すると思われることは、実際には別のより安全な方法で解決できるのではないかと思います。