I forget some notes .. *NOTE: for this System monitor to work, Requires libstatgrab and pystatgrab .*
libstatgrab + pystatgrab works under Linux and Cygwin. for linux under debian based distro. apt-get install libstatgrab to get statgrab library and get pystatgrab here : http://www.i-scream.org/pystatgrab/ * NOTE: layout.html is not used so jquery files and ajax files need to be included manually.* For short: Following 2 JQuery Function does the trick: $.post(('cpumon'),function(data) { if (data < 6){ $("#amount").animate( { width: 6 + "%" },1000); document.getElementById('amount').innerHTML=data + '%'; } This makes posts in parallel. <script language="JavaScript1.8"> > var clockid = 0; > function updatecpu() > { > if(clockid) > { > clearTimeout(clockid); > clockid = 0; > } > cpueffect(); > clockid = setTimeout('updatecpu()',2000) ; > > } > <script language="JavaScript1.8"> > > var clockid2 = 0; > function updatemem() > { > if(clockid2) > { > clearTimeout(clockid2); > clockid2 = 0; > } > memeffect(); > clockid2 = setTimeout('updatemem()',2000) >> >> ; >> >> } > > > > On Mon, Oct 27, 2008 at 3:13 PM, Phyo Arkar <[EMAIL PROTECTED]>wrote: > 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 -~----------~----~----~----~------~----~------~--~---