Access Object From 2 Applications or Fix Scheduler

Hendrik van Rooyen mail at microcorp.co.za
Tue Jul 17 01:46:30 EDT 2007


 "Robert Rawlins - Think Blue" <robert.rawlins at think......ia.co.uk> top posted:

>Also Hendrik,
>
>I should probably mention that the second application is a constant running
>application, it's nothing something that can just be 'started' by the first
>one, its running non-stop and just needs data passed into it regularly when
>the first application finds it.
>
>Application 1 Application 2
>Work with dict
>Work with dict
>Work with dict
>Work with dict
>New XML Found, Parse Into Dict --------------> Work with new dict
>Work with new dict
>Work with new dict
>Work with new dict
>
>You see how that works? Application 1 has a function that runs every minute
>and _may_ find a new xml file, if it does then I need it to parse that file
>into a list of dictionary and then pass that into application 2, which then
>starts using it :-)

ok - I see the difference - when you said schedule, I was thinking 
something like a cron job..

>
>Now we may be able to avoid this if there is some type of file watcher
>function available in python, my second application could then just watch
>the XML file and as soon as a new one is available parse it itself. Is that
>something you've heard of?

no to the tail like functionality - but then I am not an expert on what
is available

Now being a thread fanatic, I would do this sort of thing with a 
thread for scanning the world for the new XML, and if it finds 
a new thing, have it create the new dict.  (While it is doing this, 
the main thread is still using the old one).  Then, when the new 
dict is ready, I would put it on a Queue, which the main thread 
checks every time before it accesses the working dict, and then
if there is a new one, "overwrites" the old working one with the
new one by assigning the working dict name to the one from 
the queue:

try:
    workdict = dict_q.get()
except Queue.Empty:
    pass

where dict_q is the instance of Queue.Queue() that is used 
to link the two threads - create it in  __main__ before
starting the seeker thread so that it is visible to both the seeker
and worker that __main__ calls.   "  dict_q = Queue.Queue() "

After making the new dict, the seeker simply puts it on the queue
like this:

dict_q.put(new_dict)

Can't be simpler.

This has the advantage that the swap is made at a sensible point
in the worker thread, and the scheduling can be done in the 
seeker thread simply by calling time.sleep(60.0) at the start
of a while True loop. - it won't give you exactly sixty seconds 
to the millisecond, but this probably does not matter for something 
like this. - as long as you start using the new data "soon" its
probably all right.

For starting a thread, look at thread for basics and threading
for fancy, if you don't know already. I use thread because 
I am simple minded.

- Hendrik





More information about the Python-list mailing list