因为我不太了解Ladon,Webservices和Apache使用的基础策略或协议(我在Windows Apache服务器上使用带有mod_wsgi.so的Ladon和Python - 切换到Ubuntu系统)
我想知道是否可以为python加载一些ressources,这样暴露的方法可以使用python代码中的这些资源而不必在考虑/向Web服务提供新查询时再次加载这些资源?
如果可能的话,你有任何关于如何实现这一点的线索,或者如果没有任何解决方法吗?
通常我从加载(I / O)花费太多时间的文件加载一些巨大的词典,并且在接收每个新的ladon查询时加载它,WS太慢了,我想告诉Ladon: “在apache启动时加载它,并在Apache运行的所有时间内将其作为字典提供给我的所有python Web服务/代码”。我不会修改这些数据,因此我只需要能够读取/访问它们。
最好的问候
第一次编辑:如果这可以帮助,看起来像我的Ubuntu(我已经从我的Win配置切换到Ubuntu更加“标准”,希望我做对了),Apache2设置为prefork模式而不是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
@:
我要检查一下如何做到这一点,也许我也在这里添加了一些简化的代码,因为现在即使你有用的答案,我现在也处于现在状态(我可以在这里做任何事情:/)< / p>
安装MPM模式时,找到了如何here:$ 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.
答案 0 :(得分:2)
mod_wsgi在启动时启动一个或多个Python进程,并让它们继续运行以处理请求。如果加载模块或设置全局变量,当你处理下一个请求时它们仍然存在 - 但是,每个Python进程都有自己独立的内存块,所以如果配置mod_wsgi来启动8个进程并加载1G数据集,最终你将使用8G的内存。也许你应该考虑使用数据库?
编辑:谢谢格雷厄姆:-)因此,只有一个进程和多个线程,您可以在所有工作线程之间共享一个巨大字典的副本。
答案 1 :(得分:1)
我们在所有网络项目的工作中广泛使用Ladon,我有能力开发我的私人项目(我是Ladon开发人员)并获得报酬;-) 我们的一些服务有非常繁重的资源消耗,例如我们有一个文本到语音服务,每个支持的语言将大约1Gb的数据加载到内存中,以及每个支持的语言加载大约100Mb的文字预测服务。
mod_wsgi很好 - 我们也使用它 - 您需要做的是确保您的apache服务器编译为mpm-worker(http://httpd.apache.org/docs/2.2/mod/worker.html)。在此配置中,您的服务在多线程环境中运行,而不是在多进程环境中运行。结果是,您只为每个服务器进程启动一个解释器,然后在共享资源的多个底层线程中运行您的服务。需要注意的是,您必须确保您的服务不会踩到它自己的脚趾,这意味着您必须使用mutex.acquire()/ mutex.release()保护服务类实例之间共享的全局变量和类静态变量。
除此之外,Ladon作为一个框架是为多线程环境构建的。
最好的问候Jakob Simon-Gaarde