From: Randall S. <ra...@tn...> - 2003-07-27 02:10:22
|
I'm having some performance problems. It seems that when a servlet takes a long time to service a request, no other requests are completed until it finishes. The case in which I observed this behavior: I have a servlet that takes input and sends an email using smtplib. Today I had network trouble so it could not connect to the mail server. The servlet would try for about 30 or so seconds to connect before it failed. While it was attempting to connect, !!!no other servlets would respond!!! As soon as it finished, they responded. My app is not in production yet, but this looks like a potential hangup. Does this behavior sound reasonable for webkit? My understanding is that servlets fill requests in serial and that two or more different servlets should be able to fill requests at the same time. Is this correct? If so, then I may need to reconfigure my application because it seems that only one servlet can respond at one time. The serial thing raises another issue. I have been building my application with a controller(Index.py) that receives all requests and directs them (self.forward()) to the appropriate servlet. It makes my program feel more like an application than a pile of scripts. Anyway, I'm beginning to think that my application will only be able to serve one request at a time becuase every requests goes to Index.py before it is forwarded. It really want to use webware (I love Python), so please tell me how I can make it perform well. Randall |
From: <zu...@zu...> - 2003-07-27 11:12:59
|
> Date: Sat, 26 Jul 2003 21:10:07 -0500 > From: Randall Smith <ra...@tn...> > > I have a servlet that takes input and sends an email using smtplib. > Today I had network trouble so it could not connect to the mail server. > The servlet would try for about 30 or so seconds to connect before it > failed. While it was attempting to connect, !!!no other servlets would > respond!!! As soon as it finished, they responded. My app is not in > production yet, but this looks like a potential hangup. Does this > behavior sound reasonable for webkit? > > My understanding is that servlets fill requests in serial and that two > or more different servlets should be able to fill requests at the same > time. Is this correct? If so, then I may need to reconfigure my > application because it seems that only one servlet can respond at one time. > > The serial thing raises another issue. I have been building my > application with a controller(Index.py) that receives all requests and > directs them (self.forward()) to the appropriate servlet. It makes my > program feel more like an application than a pile of scripts. Anyway, > I'm beginning to think that my application will only be able to serve > one request at a time becuase every requests goes to Index.py before it > is forwarded. I used to have a similar problem at http://zunzun.com, where a large data set would take a lo-o-o-o-ong time to surface fit using nonlinear methods. Originally I served requests serially as well, so everyone using the site had to wait until the larger data sets completed. I solved the problem by multithreading my application using WebKit's threads. Multiple users can have their requests served simultaneously, and I have a status page refreshing every two seconds using another servlet that checks the long-running thread's progress. To see this in action try running the function finders on my site. James Phillips http://zunzun.com |
From: jose <jo...@cy...> - 2003-07-28 03:47:47
|
Could you please post a code snippet so that I can see how you implemented threading? Thanks Jose -----Original Message----- From: web...@li... [mailto:web...@li...] On Behalf Of zu...@zu... Sent: Sunday, July 27, 2003 4:13 AM To: web...@li... Subject: [Webware-discuss] Performance Concern > Date: Sat, 26 Jul 2003 21:10:07 -0500 > From: Randall Smith <ra...@tn...> > > I have a servlet that takes input and sends an email using smtplib. > Today I had network trouble so it could not connect to the mail > server. The servlet would try for about 30 or so seconds to connect > before it failed. While it was attempting to connect, !!!no other > servlets would respond!!! As soon as it finished, they responded. My > app is not in production yet, but this looks like a potential hangup. > Does this behavior sound reasonable for webkit? > > My understanding is that servlets fill requests in serial and that two > or more different servlets should be able to fill requests at the same > time. Is this correct? If so, then I may need to reconfigure my > application because it seems that only one servlet can respond at one > time. > > The serial thing raises another issue. I have been building my > application with a controller(Index.py) that receives all requests and > directs them (self.forward()) to the appropriate servlet. It makes my > program feel more like an application than a pile of scripts. Anyway, > I'm beginning to think that my application will only be able to serve > one request at a time becuase every requests goes to Index.py before > it is forwarded. I used to have a similar problem at http://zunzun.com, where a large data set would take a lo-o-o-o-ong time to surface fit using nonlinear methods. Originally I served requests serially as well, so everyone using the site had to wait until the larger data sets completed. I solved the problem by multithreading my application using WebKit's threads. Multiple users can have their requests served simultaneously, and I have a status page refreshing every two seconds using another servlet that checks the long-running thread's progress. To see this in action try running the function finders on my site. James Phillips http://zunzun.com ------------------------------------------------------- This SF.Net email sponsored by: Free pre-built ASP.NET sites including Data Reports, E-commerce, Portals, and Forums are available now. Download today and enter to win an XBOX or Visual Studio .NET. http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01 /01 _______________________________________________ Webware-discuss mailing list Web...@li... https://lists.sourceforge.net/lists/listinfo/webware-discuss |
From: <zu...@zu...> - 2003-07-28 11:25:26
|
> Could you please post a code snippet so that I can see how you > implemented threading? WebKit did the actual threading once I configured it to have multiple threads. After that, I had to make certain that each thread had it's own data dictionary. I shamelessly took the idea from ActiveState's web site at http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66429 I have functions that return this thread's data dictionary, or another thread's data dictionary. Makes it convenient for the threads to talk to each other. Make certain to delete the dictionary for each thread when it sleeps. My code is: if not vars().has_key("_tss"): _tss = {} if not vars().has_key("_tss_lock"): tss_lock = thread.allocate_lock() # get's specified thread's data dictionary def get_tss_id(thread_id): """Return a thread-specific storage dictionary.""" tss = _tss.get(thread_id) if tss is None: # First time being called by this thread. try: # Entering critical section. tss_lock.acquire() _tss[thread_id] = tss = {} # Create a thread-specific dictionary. finally: tss_lock.release() return tss # gives this thread's data dictionary def get_tss(): """Return a thread-specific storage dictionary.""" return get_tss_id(thread.get_ident()) # Identify the calling thread. # resets a specified thread's data dictionary def reset_tss(thread_id): if _tss.has_key(thread_id): del _tss[thread_id] James Phillips http://zunzun.com |
From: Aaron H. <aaron@MetroNY.com> - 2003-07-28 14:17:04
|
I like your idea for letting threads talk to each other, but for the specific case of sending an email I think a generic email handler would be better. Maybe start an email handler and use a queue to pass in requests, along w/ the username and sessionID. This way if an email does not get sent you could have an opportunity to log an message somewhere to that effect. On the other hand if a user does something in a website that sends email they expect to get the email within a few minutes. Unless you are sending a huge message you should not need threading if your email server is awake. What you may need is just something like: try: sendEmail('From','to','Your new password',body) except: response.write ('Sorry - our email server does not like you in partciular, others can send email just not you') -Aaron zu...@zu... wrote: >>Could you please post a code snippet so that I can see how you >>implemented threading? >> >> > >WebKit did the actual threading once I configured it to >have multiple threads. After that, I had to make certain >that each thread had it's own data dictionary. > >I shamelessly took the idea from ActiveState's web site at >http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66429 > >I have functions that return this thread's data dictionary, >or another thread's data dictionary. Makes it convenient for >the threads to talk to each other. Make certain to delete >the dictionary for each thread when it sleeps. My code is: > >if not vars().has_key("_tss"): > _tss = {} >if not vars().has_key("_tss_lock"): > tss_lock = thread.allocate_lock() > > ># get's specified thread's data dictionary >def get_tss_id(thread_id): > """Return a thread-specific storage dictionary.""" > tss = _tss.get(thread_id) > if tss is None: # First time being called by this thread. > try: # Entering critical section. > tss_lock.acquire() > _tss[thread_id] = tss = {} # Create a thread-specific dictionary. > finally: > tss_lock.release() > return tss > ># gives this thread's data dictionary >def get_tss(): > """Return a thread-specific storage dictionary.""" > return get_tss_id(thread.get_ident()) # Identify the calling thread. > ># resets a specified thread's data dictionary >def reset_tss(thread_id): > if _tss.has_key(thread_id): > del _tss[thread_id] > > > James Phillips > http://zunzun.com > > > >------------------------------------------------------- >This SF.Net email sponsored by: Free pre-built ASP.NET sites including >Data Reports, E-commerce, Portals, and Forums are available now. >Download today and enter to win an XBOX or Visual Studio .NET. >http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01 >_______________________________________________ >Webware-discuss mailing list >Web...@li... >https://lists.sourceforge.net/lists/listinfo/webware-discuss > > -- -Aaron http://www.MetroNY.com/ "I don't know what's wrong with my television set. I was getting C-Span and the Home Shopping Network on the same station. I actually bought a congressman." - Bruce Baum |
From: Ian B. <ia...@co...> - 2003-07-27 04:32:16
|
On Sat, 2003-07-26 at 21:10, Randall Smith wrote: > The case in which I observed this behavior: > > I have a servlet that takes input and sends an email using smtplib. > Today I had network trouble so it could not connect to the mail server. > The servlet would try for about 30 or so seconds to connect before it > failed. While it was attempting to connect, !!!no other servlets would > respond!!! As soon as it finished, they responded. My app is not in > production yet, but this looks like a potential hangup. Does this > behavior sound reasonable for webkit? No, this is definitely not normal or intended behavior. But Webware runs in a threaded environment -- that means if there's some lock that all servlets try to acquire, only one of them will be able to run at a time. The Global Interpreter Lock is an implicit lock which all threads share, and that may be the problem -- though things like network operations are definitely not supposed to hold onto the GIL when they are stalled. Your use of a single Index.py through which all requests go shouldn't cause a problem -- though I suspect what you are achieving through that is similar to what other developers do through SitePage (i.e., a subclass of Page that all your application pages inherit from, which defines common logic for your application) -- but there's probably nothing wrong with how you are doing it. If you are somehow hitting a lock in Index.py, that would of course effect all your requests. Ian |
From: Lothar S. <ll...@we...> - 2003-07-27 04:40:56
|
Hello Randall, Sunday, July 27, 2003, 4:10:07 AM, you wrote: RS> I'm having some performance problems. It seems that when a servlet RS> takes a long time to service a request, no other requests are completed RS> until it finishes. Are you sure that you used the ThreadedServer, this means are you sure that you didn't modify for example "launch.py" by hand for debugging reasons. Best regards, Lothar mailto:ll...@we... |
From: Ian B. <ia...@co...> - 2003-07-27 21:14:36
|
On Sun, 2003-07-27 at 13:13, Randall Smith wrote: > Thanks for the prompt response. I did some testing today and Webware > worked beautifully. Better than I expected. I used time.sleep() to > simulate a lengthy response time and all servlets, even that same > servlet, responded without hesitation or problem. I apologize for my > hastiness. I should have done more testing first. I'm very excited > about using Python (instead of PHP) to program for the web and got a > little upset when I thought I may have to revert to PHP. I'm not sure > what caused problems yesteday. The only thing different was that I had > no internet connection ??? Perhaps it was your browser that was stalling as it waited for the request to finish, not the server. Ian |