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.