On Aug 25, 2010, at 8:12 PM, Jonathan Lundell wrote:
> 
> On Aug 25, 2010, at 7:56 PM, mdipierro wrote:
>> 
>> This is a bug. I fixed it in trunk. Thanks Jonathan.
> 
> It's fixed in the sense that it won't raise an exception. But now how is 
> calling _unlock different from calling forget?

Nag.

> 
>> 
>> On Aug 25, 9:30 pm, Jonathan Lundell <jlund...@pobox.com> 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 <jlund...@pobox.com> 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 <phyo.arkarl...@gmail.com> 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 <mdipie...@cs.depaul.edu> wrote:
>>> 
>>>>>>>> On Aug 25, 11:00 am, Phyo Arkar <phyo.arkarl...@gmail.com> 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 <pierre.thibau...@gmail.com> 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 <johnmhee...@gmail.com> 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