This is a bug. I fixed it in trunk. Thanks Jonathan.

On Aug 25, 9:30 pm, Jonathan Lundell <[email protected]> wrote:
> On Aug 25, 2010, at 6:37 PM, mdipierro wrote:
>
>
>
> > The problem is only if have two http request from the same client in
> > the same session
>
> Thanks for that; I was wondering under which conditions unlocking might be 
> permissible (and I'm still not entirely clear, but never mind for now).
>
> My concern is this. Here's unlock:
>
>     def _unlock(self, response):
>         if response and response.session_file:
>             try:
>                 portalocker.unlock(response.session_file)
>                 response.session_file.close()
>                 del response.session_file  <<<<<-------------------------
>             except: ### this should never happen but happens in Windows
>                 pass
>
> Now we save the session file:
>
>     def _try_store_on_disk(self, request, response):
>         if response._dbtable_and_field \
>                 or not response.session_id \
>                 or self._forget:
>             self._unlock(response)
>             return
>         if response.session_new:
>             # Tests if the session folder exists, if not, create it
>             session_folder = os.path.dirname(response.session_filename)
>             response.session_file = open(response.session_filename, 'wb')
>             portalocker.lock(response.session_file, portalocker.LOCK_EX)
>         cPickle.dump(dict(self), response.session_file)  
> <<<<<<<<<----------------
>         self._unlock(response)
>
> But response.session_file is None at this point.
>
>
>
> > A arrives loads session and unlocks
> > B arrives loads session and unlocks
> > A change session and saves it
> > B changes session and saves it
>
> > Nothing breaks but B never sees changes made by A and they are
> > overwritten by B.
> > With locks
>
> > A arrives loads session
> > B arrives and waits
> > A change session and saves it
> > B loads session (with changes made by A)
> > B changes session and saves it
>
> > On Aug 25, 3:52 pm, Jonathan Lundell <[email protected]> wrote:
> >> On Aug 25, 2010, at 1:41 PM, mdipierro wrote:
>
> >>> call
>
> >>> session._unlock()
>
> >>> if you do not need session locking
>
> >> If you do that (without calling session.forget), what will happen in 
> >> _try_store_on_disk when cPickle.dump(dict(self), response.session_file) is 
> >> called with a None file argument? Or is cPickle.dump cool with that? Or am 
> >> I misreading the logic?
>
> >>> On Aug 25, 11:38 am, Phyo Arkar <[email protected]> wrote:
> >>>> Yes may be session was locked , thats why
> >>>> session.current=processing_path not working
>
> >>>> But then again , while processing files i try opening separate page ,
> >>>> to other controller , it was waited till the first (file Crawler) page
> >>>> finished parsing.
>
> >>>> ok i will make a separate thread about this.
>
> >>>> On 8/25/10, mdipierro <[email protected]> wrote:
>
> >>>>> On Aug 25, 11:00 am, Phyo Arkar <[email protected]> wrote:
> >>>>>> Did I Read that reading files inside controller will block web2py , 
> >>>>>> Does
> >>>>>> it?
>
> >>>>> No web2py does not block. web2py only locks sessions that means one
> >>>>> user cannot request two concurrent pages because there would be a race
> >>>>> condition in saving sessions. Two user can request different pages
> >>>>> which open the same file unless the file is explicitly locked by your
> >>>>> code.
>
> >>>>>> Thats a bad news.. i am doing a file crawler and while crawling ,
> >>>>>> web2py is blocked even tho the process talke only 25% of 1 out of 4
> >>>>>> CPUs ..
>
> >>>>> Tell us more or I cannot help.
>
> >>>>>> On 8/25/10, pierreth <[email protected]> wrote:
>
> >>>>>>> I would appreciate a good reference to understand the concepts you are
> >>>>>>> talking about. It is something new to me and I don't understand.
>
> >>>>>>> On 25 août, 11:22, John Heenan <[email protected]> wrote:
> >>>>>>>> No, nothing that abstract. Using WSGI forces a new thread for each
> >>>>>>>> request. This is is a simple and inefficient brute force approach 
> >>>>>>>> that
> >>>>>>>> really only suits the simplest Python applications and where only a
> >>>>>>>> small number of concurrent connection might be expected.
>
> >>>>>>>> Any application that provides web services is going to OS block on
> >>>>>>>> file reading (and writing) and on database access. Using threads is a
> >>>>>>>> classic and easy way out that carries a lot of baggage. Windows has
> >>>>>>>> had a way out of this for years with its asynch (or event)
> >>>>>>>> notification set up through an OVERLAPPED structure.
>
> >>>>>>>> Lightttpd makes use of efficient event notification schemes like
> >>>>>>>> kqueue and epoll. Apache only uses such schemes for listening and 
> >>>>>>>> Keep-
> >>>>>>>> Alives.
>
> >>>>>>>> No matter how careful one is with threads and processes there always
> >>>>>>>> appears to be unexpected gotchas. Python has a notorious example, the
> >>>>>>>> now fixed 'Beazly Effect' that affected the GIL. Also I don't think
> >>>>>>>> there is a single experienced Python user that trusts the GIL.
>
> >>>>>>>> John Heenan

Reply via email to