0

Ladon、Webservices、Apacheで使用されている基本的な戦略やプロトコルをよく知らないため(Windows Apacheサーバーでmod_wsgi.soを使用してLadonとPythonを使用しています-Ubuntuシステムに切り替えました)

これにより、Pythonの一部のリソースを一度ロードできるので、公開されたメソッドは、Webサービスへの新しいクエリの提供を検討するときに、これらのリソースを再度ロードしなくても、Pythonコードからこれらのリソースを使用できるのでしょうか。

可能であればこれを達成する方法について何か手がかりがありますか、そうでない場合は回避策がありますか?

通常、ロード(I / O)に時間がかかりすぎるファイルからいくつかの巨大な辞書をロードしています。新しいラドンクエリを受信するたびにロードされるため、WSが遅すぎるため、ラドンに次のように伝えます。 apacheが起動すると、Apacheが実行されている間、すべてのPythonWebサービス/コードで辞書として利用できるようになります。」これらのデータは変更しないので、読み取り/アクセスできる必要があります。

よろしくお願いします

最初の編集:これが役立つ場合は、私のUbuntuのように見えます(Win構成からUbuntuに切り替えて、より「標準」にしたので、これが正しいことを願っています)、Apache2はMPMではなくプリフォークモードに設定されています( Jakob Simon-Gaardeによって提案されました)から読んだ:

@: sudo /usr/sbin/apache2 -l
Compiled in modules:
  core.c
  mod_log_config.c
  mod_logio.c
  prefork.c
  http_core.c
  mod_so.c
@: sudo /usr/sbin/apache2 -l | grep MPM
@:

私はこれがどのように行われるかをチェックするつもりです、多分私はここにいくつかの単純化されたコードも入れています、なぜなら今のところ私はあなたの役に立つ答えでさえもとにかくいないからです(私はここで何でもうまくいくことができます:/)

MPMモードをインストールするとき、ここで行う方法を見つけました:$ sudo apt-get install apache2-mpm-worker

最後の編集

これが私のWSコードのスケルトンです:

MODEL_DIR = "/home/mydata.file"

import sys
import codecs
import glob
import os
import re

import numpy

from ladon.ladonizer import ladonize
from ladon.types.ladontype import LadonType
from ladon.compat import PORTABLE_STRING

class Singleton(type): 
    _instances = {} 
    def __call__(cls, *args, **kwargs): 
        if cls not in cls._instances: 
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 
        return cls._instances[cls] 

class LDtest(object):
    __metaclass__ = Singleton
    modeldir = MODEL_DIR
    def __init__(self):
        self.load()

    def load(self):
        modeldir = LDtest.modeldir
        self.data = mywrapperfordata.mywrapperfordata(modeldir)
        b = datetime.datetime.now()
        self.features = self.mywrapperfordata.load() # loading is wrapped here
        c = datetime.datetime.now()
        print("loading: %s done." % (c-b))

    def letsdoit(self, myinput):
        return [] # actually main logic ie complex stuff involving accessing to self.features

    @ladonize(PORTABLE_STRING, [ PORTABLE_STRING ], rtype = [ PORTABLE_STRING ] )
    def ws(self, myinput):
        result = self.letsdoit(myinput)
        return result

import datetime
a = datetime.datetime.now()
myLDtest = LDtest()
b = datetime.datetime.now()
print("LDtest: %s" % (b-a))

ロード時間について:私のapache2ログから:-モジュール1が必要であり、モジュール2によってインポートされ、孤独なWebサービスとして提供されていることに注意してください。シングルトンが構築されていないか、十分な速さではないように見えますか?

[Tue Jul 09 11:09:11 2013] [notice] caught SIGTERM, shutting down
[Tue Jul 09 11:09:12 2013] [notice] Apache/2.2.16 (Debian) mod_wsgi/3.3 Python/2.6.6 configured -- resuming normal operations
[Tue Jul 09 11:09:50 2013] [error] Module 4: 0:00:02.885693.
[Tue Jul 09 11:09:51 2013] [error] Module 0: 0:00:03.061020
[Tue Jul 09 11:09:51 2013] [error] Module 1: 0:00:00.026059.
[Tue Jul 09 11:09:51 2013] [error] Module 1: 0:00:00.012517.
[Tue Jul 09 11:09:51 2013] [error] Module 2: 0:00:00.012678.
[Tue Jul 09 11:09:51 2013] [error] Module (dbload): 0:00:00.402387 (22030)
[Tue Jul 09 11:09:54 2013] [error] Module 3: 0:00:00.000036.
[Tue Jul 09 11:13:00 2013] [error] Module 0: 0:00:03.055841
[Tue Jul 09 11:13:01 2013] [error] Module 1: 0:00:00.026215.
[Tue Jul 09 11:13:01 2013] [error] Module 1: 0:00:00.012600.
[Tue Jul 09 11:13:01 2013] [error] Module 2: 0:00:00.012643.
[Tue Jul 09 11:13:01 2013] [error] Module (dbload): 0:00:00.322444 (22030)
[Tue Jul 09 11:13:03 2013] [error] Module 3: 0:00:00.000035.
4

2 に答える 2

2

mod_wsgiは、起動時に1つ以上のPythonプロセスを起動し、リクエストを処理するためにそれらを実行したままにします。モジュールをロードするか、グローバル変数を設定すると、次のリクエストを処理するときにそれらは引き続き存在します-ただし、各Pythonプロセスには独自の個別のメモリブロックがあるため、8つのプロセスを起動して1Gをロードするようにmod_wsgiを構成するとデータセット、最終的には8Gのメモリを使用することになります。たぶん、データベースの使用を検討する必要がありますか?

編集:ありがとうGraham :-)したがって、1つのプロセスと複数のスレッドだけで、すべてのワーカースレッド間で巨大な辞書の1つのコピーを共有できます。

于 2012-09-05T16:48:42.127 に答える
1

私たちはすべての Web プロジェクトで Ladon を広く使用しており、プライベート プロジェクト (私は Ladon 開発者です) を開発し、その対価を得る特権を持っています ;-) 私たちのサービスの中には、非常に大量のリソースを消費するものがあります。 、たとえば、サポートされている言語ごとに約 1Gb のデータをメモリにロードするテキスト読み上げサービスと、サポートされている言語ごとに約 100Mb をロードする wordprediction サービスがあります。

mod_wsgi は問題ありません - 私たちはそれも使用します - Apache サーバーが mpm-worker ( http://httpd.apache.org/docs/2.2/mod/worker.html ) としてコンパイルされていることを確認する必要があります。この構成では、サービスはマルチプロセス環境ではなくマルチスレッド環境で実行されます。その結果、サーバー プロセスごとに 1 つのインタープリターのみを起動し、リソースを共有する複数の基になるスレッドでサービスを実行します。注意点は、サービスが独自のつま先を踏まないようにする必要があることです。つまり、mutex.acquire()/mutex.release() を使用して、サービス クラス インスタンス間で共有されるグローバル変数とクラス静的変数を保護する必要があります。 .

フレームワークとしてのLadon以外は、マルチスレッド環境向けに構築されています。

敬具ヤコブ・シモン・ガルデ

于 2012-09-06T21:01:34.737 に答える