473,378 Members | 1,504 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,378 software developers and data experts.

Use a Thread to reload a Module?

Hi Python Experts,

I hope I can explain this right. I'll try.

Background:
I have a module that I leave running in a server role. It has a
module which has data in it that can change. So every nth time a
function in the server gets called, I want to reload the module so it
has the freshest data. But there's a lot of data so it takes 5-10
seconds to do a reload.

My question is:
Would I be able to launch a seperate thread to reload the module while
the server does it work? Hopefully it would be using the old module
data right up until the thread was finished reloading.

Thanks in advance,

Greg

Here's some psuedo code that might illustrate what I'm talking about:

import lotsa_data

def serve():
reload(lotsa_data) #can this launch a thread so "do_stuff" runs right away?
do_stuff(lotsa_data.data)

while 1:
listen_for_requests()
Dec 22 '06 #1
3 1967
Gregory Piñero wrote:
Hi Python Experts,

I hope I can explain this right. I'll try.

Background:
I have a module that I leave running in a server role. It has a
module which has data in it that can change. So every nth time a
function in the server gets called, I want to reload the module so it
has the freshest data. But there's a lot of data so it takes 5-10
seconds to do a reload.

My question is:
Would I be able to launch a seperate thread to reload the module while
the server does it work? Hopefully it would be using the old module
data right up until the thread was finished reloading.

Thanks in advance,

Greg

Here's some psuedo code that might illustrate what I'm talking about:

import lotsa_data

def serve():
reload(lotsa_data) #can this launch a thread so "do_stuff" runs rightaway?
do_stuff(lotsa_data.data)

while 1:
listen_for_requests()
Using a thread for this purpose is no problem. Using a module: yep,
that's a problem. (I'd say using a module in this way, to update data,
is very far from best practice, but its convenience justifies simple
uses. You are going beyond simple now, though.)

Not knowing more about your program, I'd say the simplest way is:

1. exec, don't reload, your data file (with the standard warning that
exec should only be used on carefully contructed code, or to
deliberately give the user the power to input python code--of course
the same warning applies when reloading a dynamically generated
module).

2. Store the new data somewhere (such as a Queue) waiting for a good
time to update.

3. At a convenient time, overwrite the old data in the module.

I'm going to assume that your server has heretofore been
single-threaded; therefore you don't need locks or queues or semaphores
in your main code. Here, then, is a very improvable example to
consider. Notice that the lotsa_data module is empty. Instead, you
call load_data() to exec the file where the data really is, and it puts
the loaded data into a queue. Next time you wait for a new request, it
checks to see if there are any data updates in the queue, and updates
the date in lotsa_data module if so.

import Queue
import threading
import lotsa_data ## empty!

data_update_queue = Queue.Queue()

def serve():
if request_count % n:
threading.Thread(target=load_data).start()
do_stuff(lotsa_data.data)
request_count += 1

def load_data()
d = {}
exec "/path/to/data/file" in d
data_update_queue.put(d)

load_data() # run once in main thread to load data initially
while True:
try:
d = data_update_queue.get_nowait(d)
except Queue.Empty:
pass
else:
for key,value in d:
setattr(losta_data,key,value)
listen_for_requests()
There is much room for improvement. For example, can requests come in
fast enough to spawn another load_data before the first had ended? You
should consider trying to acquire a threading.Lock in load_data and
waiting and/or returning immediately if you can't. Other things can go
wrong, too. Using threads requires care. But hopefully this'll get
you started.
Carl Banks

Dec 23 '06 #2
On 22 Dec 2006 20:02:31 -0800, Carl Banks <pa************@gmail.comwrote:
....
There is much room for improvement. For example, can requests come in
fast enough to spawn another load_data before the first had ended? You
should consider trying to acquire a threading.Lock in load_data and
waiting and/or returning immediately if you can't. Other things can go
wrong, too. Using threads requires care. But hopefully this'll get
you started.
Thanks, Carl. That gives me a lot to consider. I won't be able to
work on this project more until Wed. but I'll probably run into some
follow up questions then.

A few more details if it helps ...

That module deals with accessing data from QuickBooks, marshaling it,
and providing methods to access the marshaled data. Having the server
program keep that module and all of its data in memory makes the
server run really fast, but yeah, it does get complicated now that
it's storing 100's of MB of data. I guess most people go to a
database at this point?
It's just so easy to store the data in the Python objects I already
need them in instead of converting to tables in a DB and then
converting back. So maybe this threading will work for me.

Thanks again,

Greg
Dec 23 '06 #3
In article <ma***************************************@python. org>,
=?ISO-8859-1?Q?Gregory_Pi=F1ero?= <gr********@gmail.comwrote:
>
That module deals with accessing data from QuickBooks, marshaling it,
and providing methods to access the marshaled data. Having the server
program keep that module and all of its data in memory makes the
server run really fast, but yeah, it does get complicated now that
it's storing 100's of MB of data. I guess most people go to a
database at this point?
Very, very yes. Try using a SQLite in-memory database, maybe?
>It's just so easy to store the data in the Python objects I already
need them in instead of converting to tables in a DB and then
converting back. So maybe this threading will work for me.
You might well run into problems with the import lock. I strongly
advise against your current approach.
--
Aahz (aa**@pythoncraft.com) <* http://www.pythoncraft.com/

"I support family values -- Addams family values" --www.nancybuttons.com
Dec 24 '06 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

66
by: Ellinghaus, Lance | last post by:
> > Other surprises: Deprecating reload() >Reload doesn't work the way most people think >it does: if you've got any references to the old module, >they stay around. They aren't replaced. ...
4
by: David MacQuigg | last post by:
I'm going to be teaching EEs some basic Python using the first few chapters of Learning Python, 2nd ed. by Mark Lutz. The discussion on Reloading Modules starting on page 266 is confusing and I...
1
by: Emmanuel | last post by:
Hi, I use a 'reload all' feature in my app, that allow to reload every module. I first try this version : import sys def Reload():
0
by: Mustafa Thamer | last post by:
Hi, I'm using import hooks according to PEP 302, in order to load python files from a game PAK file. The game is C++ using embedded and extended Python (v2.33) and Boost. The importing works...
4
by: test1dellboy3 | last post by:
Hi, I am a beginner using the python interpreter. To reduce typing effort, I created a module called "aliases.py" containing some aliases for objects I commonly use like - aliases.py : ...
4
by: Lonnie Princehouse | last post by:
So, it turns out that reload() fails if the module being reloaded isn't in sys.path. Maybe it could fall back to module.__file__ if the module isn't found in sys.path?? .... or reload could...
3
by: John Salerno | last post by:
I understand that after you import something once, you can reload it to pick up new changes. But does reload work with from statements? I tried this: from X import * and then did my testing....
3
by: Stef Mientki | last post by:
hello, I've a graphical application (wxPython), where the code in the main GUI loop is given below. 1 JAL_Loaded = False 2 while len(App_Running) 0: 3 if JALsPy_globals.State...
0
by: Rafe | last post by:
Hi, This seems to be an old question, and I've read back a bit, but rather than assume the answer is "you can't do that", I'd thought I'd post my version of the question along with a...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.