|
dharana
dharana at dharana.net
Sat Apr 9 17:59:16 EDT 2005
One small question. If the issue of submodules being cached by
mod_python is so frequent, shouldn't be an indicator that perhaps
something should be changed?
I know there are archives. I know it may probable has been answered many
times before but everytime I'm coding with mod_python I have a terminal
with buffers full of "apachectl restart" and as Python is an interpreted
language, not a compiled one I always find it weird to need to do that.
Isn't it trivial or correct to import the vampire caching mechanism into
mod_python and _only_ use it with an specific apache Python* directive?
Graham Dumpleton wrote:
> I am starting to sound like a broken record, but the module importing
> system in
> Vampire addresses all these sorts of problems with modifications to sub
> imports
> and will reload unchanged parent modules even when it is only a sub
> import that
> has changed. Thus it is possible when using Vampire to make changes without
> restarting Apache and they will all be picked up correctly.
>
> There is so far only one class of problem I know of where when using
> Vampire one
> would still need to do a restart. This is where objects are cached and type
> comparisons are being done between cached objects and some class type
> they are
> meant to be created from. This can still fail because on a reload the type
> object itself could be replaced and therefore will not match the type
> object
> of a cached instance of a previous version. This problem also occurs in the
> standard mod_python module loading system and isn't Vampire specific
> though.
>
> I'll go into this more or point to previous posts I have made on this
> topic if
> you are genuinely interested in trying to switch to Vampire.
>
> Note that Vampire isn't a framework which requires you to change absolutely
> everything. It doesn't force you to use a specific templating system.
> Its main
> purpose is to expand on the basic selection mechanism for handlers in
> mod_python
> and address all these module reloading issues by providing an alternate
> module
> loading system.
>
> Graham
>
> On 10/04/2005, at 5:25 AM, Jim Gallacher wrote:
>
>> Hi Barry,
>>
>> Barry Pearce wrote:
>>
>>> Hi Jim,
>>>
>>>>> This is an interesting issue - I have my own handler but I have a
>>>>> problem where mod_python does NOT cause modules to be reloaded -
>>>>> despite having changed on the disk I would have expected the module
>>>>> to reload...but it stays the same until I restart the web server -
>>>>> perhaps there is something Im doing wrong!!
>>>>>
>>>>> I really dont want to restart the apache server to upgrade my
>>>>> software - it kills all current sessions and downloads....
>>>>>
>>>>> Any ideas?
>>>>
>>>>
>>>>
>>>>
>>>> My impression is that the handler specified in the apache
>>>> PythonHandler directive does not get reloaded when changed. Of
>>>> course I may be completely off the mark here.
>>>
>>> Ah. OK....thats why everything that it in turn imports also remains
>>> fixed in memory...its just a pain in the bum when I change something
>>> that the re-import does not take place.
>>>
>>>> For my code, the PythonHandler cms.publisher is just a stub that
>>>> does a little pre-processing and then uses apache.import_module() to
>>>> get my real handler. It's apache.import_module that does the
>>>> reloading magic, and so I avoid restarting apache when my handler
>>>> code changes. I figure once my code has pretty much settled down, I
>>>> can change the PythonHandler to specify the real handler.
>>>
>>> The issue comes during upgrade of live sites with many users with
>>> concurrent sessions and no 'quiet' period per say where a restart
>>> could be sensibly placed.
>>> Interestingly I have been using a large number of python files and
>>> using the standard python import - however, if the top level module
>>> is not reimported it will never execute any of the other import
>>> statements.
>>> Interesting...sorry im rambling...
>>> Perhaps I need to re-evaluate my import strategy and call
>>> apache.import_module() instead of just relying on the python import...
>>> Now I dont want it all checked on each request - but maybe I can
>>> write a handler that I can send a request to which re-evalutes all
>>> imported modules and then appropriately reloads them...
>>
>>
>> I don't think this will work in the apache prefork model. (I have no
>> idea about the threaded model). In the prefork, each child process has
>> it's own copy of the python interpreter and modules. Your call to the
>> special handler will only cause the child that handles that request to
>> reload. All the other children will still have a copy of the old
>> modules. You have to make sure that each child gets a new copy - which
>> is what happens when you restart apache. All the child processes are
>> killed and then new ones created which will import the new modules.
>>
>> So maybe your main handler can check a flag defined by a PythonOption
>> directive and reload as necessary? Thus each child process will be
>> forced to reload it's modules.
>>
>> def handler(req):
>> opts = req.get_options()
>> reload_modules = int(opts.get('RELOAD_MODULES', '0'))
>>
>> if reload_modules:
>> do_magic_module_reload()
>>
>> ... handle request ...
>>
>> Edit your apache conf file for the site:
>> PythonOption RELOAD_MODULES 1
>>
>> Run 'apache reload' to read the config file changes. Subsequent
>> requests will see the flag and reload of any modified modules. Once
>> everything seems to be working change the flag back to 0 and run
>> 'apache reload'.
>>
>> Or how about having a version variable defined with module scope and a
>> corresponding PythonOption directive.
>>
>> # your publisher module
>> __version__ = 41
>>
>> def handler(req):
>> opts = req.get_options()
>> if opts.has_key('MODULE_VERSION'):
>> version = int(opts['MODULE_VERSION'])
>> if __version__ < version:
>> do_magic_module_reload()
>> __version__ = version
>>
>> ... handle request ...
>>
>> And in your apache config:
>> PythonOption MODULE_VERSION 42
>>
>> There, all you need to do now is write the code for
>> do_magic_module_reload(). Oh, and send me copy when you're done. :)
>>
>> But seriously, apache.import_module won't do what you want, but it
>> looks like an interesting place to start. Python introspection is a
>> new topic for me, but I don't think a solution to this problem is too
>> difficult.
>>
>> Regards,
>> Jim
>>
>>
>>
>>
>>
>> _______________________________________________
>> Mod_python mailing list
>> Mod_python at modpython.org
>> http://mailman.modpython.org/mailman/listinfo/mod_python
>
>
> _______________________________________________
> Mod_python mailing list
> Mod_python at modpython.org
> http://mailman.modpython.org/mailman/listinfo/mod_python
>
>
>
--
Juan Alonso
|