I have not read everything carefully yet .I am doing a system monitor ajax+web2py application , which monitor CPU and MEM at the same time and updates the page with jquery ajax effects. its pretty simple.So it is multi-threading in a webapp . to get response from multiple httprequest at the same time can be done like this.
*NOTE:* for this System monitor to work, Requires libstatgrab and pystatgrab . libstatgrab + pystatgrab works under Linux and Cygwin. to *in controllers , default.py :* import statgrab def index(): return dict() def cpumon(): cpustat = statgrab.sg_get_cpu_percents() perc = int(round(100 - cpustat['idle'])) return perc def memon(): #otno=random.randrange(0,100) memstat = statgrab.sg_get_mem_stats() memdiff = memstat['total'] - (memstat['cache'] + memstat['free'] ) memfloat = float (memdiff) / float(memstat['total']) perc = int(round (memfloat * 100)) return perc in view . Index.html : <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html> <head> <title>Ajax + Web2py monitor</title> <link rel="stylesheet" type="text/css" href="css/style.css"/> <script type="text/javascript" src="js/jq.js"/> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <meta name="author" content="Your name here" /> <meta name="Copyright" content="Copyright (c) Your copyright here 2005" /> <script language="JavaScript1.8"> // You can put Functions i </script> <script language="JavaScript1.8"> var clockid = 0; function updatecpu() { if(clockid) { clearTimeout(clockid); clockid = 0; } cpueffect(); clockid = setTimeout('updatecpu()',2000); } function cpueffect() { $.post(('cpumon'),function(data) { if (data < 6){ $("#amount").animate( { width: 6 + "%" },1000); document.getElementById('amount').innerHTML=data + '%'; } else { $("#amount").animate( { width: data + "%" },1000); document.getElementById('amount').innerHTML=data + '%'; } }); } $(document).ready(updatecpu()); </script> <script language="JavaScript1.8"> var clockid2 = 0; function updatemem() { if(clockid2) { clearTimeout(clockid2); clockid2 = 0; } memeffect(); clockid2 = setTimeout('updatemem()',2000); } function memeffect() { $.post(('memon'),function(data) { $("#mem").animate( { width: data + "%" },1000); document.getElementById('mem').innerHTML=data + '%'; }); } $(document).ready(updatemem()); </script> </head> <body> <h5><a href="#" onclick=blinds() >JxMon </a></h5> <!-- ****************** BEGIN CPU Progress Bars ****************** --> <h3><a href="#" onclick=blinds() >cpu: </a></h3> <div class= "mon_cont" > <div class="cpumon_fill" id='amount'></div> </div> <h3><a href="#" onclick=blinds() >mem: </a></h3> <div class= "mon_cont" > <div class="memmon_fill" id='mem'></div> </div> </body> </html> On Mon, Oct 27, 2008 at 9:47 AM, achipa <[EMAIL PROTECTED]> wrote: > > Note that databases generally dislike multithreaded access, my patch > won't help you with that. You can shift some the problem to the > database if you're using multiple connections, but with SQLite you > don't have that option (it's not 'lite' for no reason). The database > adapter that boasts to be the best with that regard would be a > postgresql + psycopg2 backend, but even that won't save you from logic > errors and deadlocks - data consistency is tricky business in > multithread land. > > On Oct 27, 4:50 am, tommy <[EMAIL PROTECTED]> wrote: > > Archipa, when you use the different thread to access same SQLITE > > database, do you have any problem? It looks like SQLITE database can > > be only accessed by one thread. How do you walk around it? > > > > To all, thanks for your replies, I think my design has some issue. > > Massimo's example code and Bill's suggestion made me think I need to > > create another process in the background. Tito's suggestion is also > > good. but I am so bad at Ajax. > > > > Tommy > > > > On Oct 26, 4:31 pm, achipa <[EMAIL PROTECTED]> wrote: > > > > > Actually, I made a patch that allows execution of code in a parallel > > > thread after the page has been served. It can be scheduled (e.g. > > > cron), or just launched in a fire and forget fashion without affecting > > > the main app and the user (e.g. session cleaning, a long(er) > > > conversion task, etc). It runs on all platforms and under both > > > mod_wsgi and the stock cherrypy. I sent the patch to Massimo, but I > > > have had no response so far, I don't know if he disapproves of the > > > patch or simply did not have the time to review it. If there are brave > > > souls willing to try it out, I can attach it here, too. > > > > > On Oct 26, 9:52 pm, billf <[EMAIL PROTECTED]> wrote: > > > > > > Assuming an event causes the data in the "other" application to > change > > > > wouldn't it be easier for the "other" application to post the changes > > > > to your web2py app when the event occurs? Having said that, I can > > > > envisage a case where there are hundreds or thousands of updates per > > > > couple of minutes and you only want a snapsot. > > > > > > Looking at Massimo's videotest app, that seems to use the approach of > > > > starting a process outside of web2py. If that is the case then that > > > > process could execute a method after an interval that either: > > > > a) sends your web2py app a request that causes it to retrieve the > data > > > > from the "other" application and update the web2py app database, or > > > > b) the process gets the data and updates the web2py database directly > > > > (unknown to your web2py app that just selects and gets the latest) > > > > > > To stop the external process your web2py app could write to the db or > > > > a file that is checked by the external process each time it wakes up. > > > > > > Admittedly, none of the above explains how to create a background > > > > process within web2py - maybe it is just not meant to be done by a > > > > mere mortal. > > > > > > On Oct 26, 8:01 pm, tommy <[EMAIL PROTECTED]> wrote: > > > > > > > Massimo, > > > > > > > Here is my code, > > > > > > > I use GUI button to start my service (StartEngine, in the > background, > > > > > I want to retrieve the infomation from another application and save > it > > > > > in my database for every couple of munites. after I starting my > start > > > > > engine service, I can go to other screen. and the background > service > > > > > keeps runing. > > > > > > > I can create the thread now, but got an error :SQLITE object > created > > > > > in a thread can only used in that same thread. > > > > > > > def enginestart(): > > > > > menu_setup() > > > > > # engine.start() > > > > > session.starttimer=True > > > > > > > symbols=db(db.symbols.id>0).select() > > > > > > > # for symbol in symbols: > > > > > # engine.addMarket(symbol.symbol_Name, > > > > > symbol.description,symbol.tick) > > > > > > > session.flash='engine stared' > > > > > session.enginestarted=True > > > > > db(db.historyprice.id >0).delete() > > > > > # tt=threading.Timer(2, gethistoryprice(db)) > > > > > # tt.start() > > > > > t=Gethistoryprice() > > > > > t.start() > > > > > redirect(URL(r=request,c='engine',f='enginemaint')) > > > > > return dict() session.starttimer=True > > > > > > > symbols=db(db.symbols.id>0).select() > > > > > > > # for symbol in symbols: > > > > > # engine.addMarket(symbol.symbol_Name, > > > > > symbol.description,symbol.tick) > > > > > > > session.flash='engine stared' > > > > > session.enginestarted=True > > > > > db(db.historyprice.id >0).delete() > > > > > t=Gethistoryprice(db) > > > > > t.start() > > > > > redirect(URL(r=request,c='engine',f='enginemaint')) > > > > > return dict() > > > > > > > class Gethistoryprice(threading.Thread): > > > > > def __init__(self, db): > > > > > threading.Thread.__init__(self) > > > > > > > self.stopped=0 > > > > > self.db=db > > > > > > > def run(self): > > > > > while not self.stopped: > > > > > mysym=self.db(db.symbols.id>0).select() > > > > > for symbol in mysym: > > > > > # p=engine.getlastprice(symbol) > > > > > p=random.randrange(10.00,60.00) > > > > > now=datetime.datetime.now() > > > > > > db.historyprice.insert(symbol_Name=symbol.symbol_Name, > > > > > timestamp= now, price=p) > > > > > > > def stop(self): > > > > > self.stopped=1 > > > > > > > On Oct 26, 2:05 pm, mdipierro <[EMAIL PROTECTED]> wrote: > > > > > > > > This app does that. You upload a video and it is converted in > > > > > > background (like at youtube) in a separate process (not a thread, > a > > > > > > process although the process my have threads). The visitor can > later > > > > > > check the conversion was completed. It includes documentation: > > > > > > > >http://mdp.cti.depaul.edu/appliances/default/show/38 > > > > > > > > Massimo > > > > > > > > On Oct 26, 2:00 pm, Keith Edmunds <[EMAIL PROTECTED]> wrote: > > > > > > > > > On Sun, 26 Oct 2008 11:55:08 -0700 (PDT), > [EMAIL PROTECTED] > > > > > > > said: > > > > > > > > > > 1) what other background tasks do people envisage? > > > > > > > > > A regular display update via Ajax (but that could probably be > demanded by > > > > > > > the client rather than pushed) > > > > > > > > > > 2) how should you do it in web2py? > > > > > > > > > Pass. > > > > > > > > > -- > > > > > > > Keith Edmunds- Hide quoted text - > > > > > > > > - Show quoted text -- Hide quoted text - > > > > > - Show quoted text - > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---