|
francois lepoutre
francois.lepoutre at seriatim.com
Wed Nov 7 12:03:26 EST 2001
Hi all,
This mail is basically intended for developpers of NT or W2K -based
web applications who are willing to test win+Python as a web platform
or have difficulties in running their mod_python apps under windows.
Just wanted to post a few words to say how great mod_python is and
share a bit of code...
As far we are concerned, this works great and fast.
Our current development combination is:
- WIN2K server,
- apache 1.3
- mod_python,
- python
- mxodbc for db connectivity.
This combo works great for database-app applications requiring a lot of buffered
databased-informations intensive sql querying.
It took us less than 2 months to do switch a whole demanding app from
ms-tool based development on winK2 to apache+mod_python on winK2 ....
including learning python, a short and enjoyable experience :)
The result is great and fast as all demanding queries are buffered in
global dictionnaries. The only problems we have encoutered are :
- threading,
- threading,
- threading.
Python is threaded, apache-win is threaded .. Be aware that
your mod_python code should also be.
It took us A COUPLE OF WEEKS to grasp pbs that occured in
demanding race-conditions and then solve them.
This is the reason for this mail. Intended for those with limited
skills with thread. Programming data-intensive python+mod_python apps
on win32 is an easy game including for programmers with limited IT background.
BUT it is imperative to code threadsafe when coding wK2+apache+mod_python.
For those with no experience with building threadsafe code
applications (possibly the case if you work with interpreted languages),
a few recommendations for mod_python:
1) use as few globals as possible,
pass over your "state-variables" as local python objects and keep
shared variables to the absolute mimimum.
2) make sure to avoid race-conditions on those globals
if you need global (you will if you want high perfs - to store buffered database output),
make sure those global variables are updated in a tight block of code with a lock
to prevent concurrent threads to access "shared info" whilst this
information is beeing updated
The kind of python code that helped us build threadsafe mod_python code:
##################################
# in mod_python init code
global_data_lock = threading.RLock()
##################################
# in your mod_python code
# run when needed
global global_data_lock
global_data_lock.acquire()
try:
# load or update your shared data .. dictionnaries and al
load_shared_data()
finally:
global_data_lock.release()
3 ) odbc connectivy (thru mxodbc) may or not be threadsafe
Encapsulate your odbc connections in a "pool" of connections
with round-robin access to them through a shared queue
(a "webwarish" bit of code, my thanks to webware,
a great tool we'd like to investigate soon)
The kind of python code that helped us build threadsafe odbc python :
#################################
# in mod_python init code
# build a series of sleeping odbc connections
NB_CONNECTIONS = 20
connection_queue = Queue()
for each_value in range(NB_CONNECTIONS):
database_handle = ODBC.Windows.Connect('my_dsn','my_user','my_password',0)
connection_queue.put(database_handle)
##################################
# in your database code
# use them in round-robin
# every time
global connection_queue
database_handle = connection_queue.get()
cursor_handle = database_handle.cursor()
cursor_handle.execute("SELECT * FROM DUMMY")
connection_queue.put(database_handle)
mod_python on win32 rocks!
François
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.modpython.org/pipermail/mod_python/attachments/20011107/e8538e9c/attachment-0003.htm
|