Yes! you're right,  after installation pywin32 my test works properly!  
Thank you!

P.S. I think that would be better to copy/paste that Attention from 
Overview  to Session chapter and make it more *impressive*
I suppose there are many people (like me) who have read an Overview once 
and never again. 






On Tuesday, August 11, 2015 at 5:25:34 PM UTC+3, Anthony wrote:
>
> Probably you are running web2py from source with your own Python 
> installation and have not installed the pywin32 
> <http://sourceforge.net/projects/pywin32/> extension (which is required 
> for file locking). This is mentioned in the book: 
> http://web2py.com/books/default/chapter/29/03/overview?search=win32.
>
> For more details, see 
> https://docs.python.org/2.7/using/windows.html#pywin32
>
> Anthony
>
> On Monday, August 10, 2015 at 8:06:12 PM UTC-4, Val K wrote:
>>
>> As I see, the problem is that ajax request (may be not ajax only) didn't 
>> wait for closing session file by another one and read/save data from/to it 
>> at any time! Lock did not work on my Win7 because , as I think, for Win 
>> it's one  process.
>> Request processing may be not pure parallel but fully asynchronous  - I 
>> placed some print statement in ajax controller and got full chaos - among 
>> print from one request were one from another.
>> Here is my littlle test. 3 ajax calls start at once but finish 
>>  asynchronously (time.sleep()).   By change time.sleep() it's possible to 
>> get any order (I did "start first - finish last"). At the end of all 
>> session contains only vars/changes of ajax which finish last.
>>    
>>
>>
>> import time
>>
>> # it's a funny AJAX test
>> #just create new app and paste it in the default controller
>> # call   .../default/many_ajx_form
>>
>> def ajx_bug():
>>     if request.args(0)=='0':
>>         time.sleep(10) # well, now wait until fish fall asleep in the pond
>>         session.req_0='Only req_0 ... nothing else!!! Where are req_1, 
>> req_2 and other kids? It seems, that guys ignored my session lock?'
>>     elif request.args(0)=='1':    
>>         time.sleep(5) 
>>         session.req_1='I killed req_2 and created req_1 which will be 
>> killed by req_0 !'
>>     else:
>>         session.req_2='I created req_2'
>>     response.flash="click 'Print Session' !"
>>     if request.args(0)=='0':
>>         return dict(ret='Better late than never')
>>     else:
>>         return dict(ret='completed req_%s'%request.args(0))
>>
>> def print_session():
>>     lst=[]
>>     for k,v in session.items():
>>         lst.append(DIV(
>>                         DIV(k,_class='col-xs-2', 
>> _style="font-weight:bold;  text-align:right; min-height:50px"),
>>                         DIV(':',_class='col-xs-1'),
>>                         DIV(v,_class='col-xs-9'),
>>                         _class='row'
>>                        )
>>                   )
>>     return dict(r=DIV(*lst, _class="container", _style="max-width:800px"))
>>
>>
>>
>> #------------ CALL THIS --------------------
>> def many_ajx_form():
>>     session.clear() #  - for clear test
>>     session.dummy_data = 'dummy data'   # make some action for sure init 
>> session 
>>     ret={}
>>     for i in xrange(3):
>>         ret['ajx_frm_%s'%i]= \
>>         DIV(
>>             LOAD('default','ajx_bug.load',
>>                  args=[i],
>>                  ajax=True,
>>                  target='cont_%s'%i
>>                  ),
>>             _id='cont_%s'%i
>>            )
>>     
>>     btn_prnt=DIV(BUTTON("Print Session", _type="button",_class="btn 
>> btn-default",
>>                    _onclick=myLOAD_any("default","print_session", 
>> target="lst")),
>>                      DIV(_id="lst") 
>>                 )    
>>     
>>     ret['z']=btn_prnt
>>     
>>     return ret
>>
>> #return string, no SCRIPT tag!
>> def myLOAD_any(contrl, fun, target, args=None, vars=None, ):
>>
>>     if vars:
>>         vars_str='?'
>>         for k,v  in vars.items():
>>             vars_str+=('%s=%s&'%(k,v))
>>         vars_str= vars_str[:-1] # remove last '&'
>>     else:
>>         vars_str=''
>>     if args:
>>         args_str='/'.join([str(it) for it  in args])
>>     else:
>>         args_str=''
>>     data=dict(
>>            rmt= "/%s/%s/%s.load/%s%s"%(request.application, contrl, fun, 
>> args_str, vars_str ),
>>            trg=target
>>             )
>>     load_str="""$.web2py.component("%(rmt)s", "%(trg)s", 0, 1, 
>> $("#%(trg)s"));"""
>>     return load_str%data
>>
>>
>>
>>
>>
>>
>>
>> On Monday, August 10, 2015 at 4:05:57 AM UTC+3, Anthony wrote:
>>>
>>> All responses within the same session are supposed to have the same 
>>> session_id. The fact that all three Ajax requests can access the session 
>>> doesn't necessarily mean they are being processed in parallel (the requests 
>>> might still be completing one after another).
>>>
>>> It would be helpful if you could attach a minimal app that demonstrates 
>>> the problem.
>>>
>>> Anthony
>>>
>>> On Sunday, August 9, 2015 at 12:30:01 PM UTC-4, Val K wrote:
>>>>
>>>> I realize your advice - no effect!
>>>> I analyzed *session.connect* and found  strange  place at the biginig 
>>>> of *connect *definition:
>>>> ...
>>>> self._unlock(response)   # -  *unconditional unlock *session file 
>>>> witch have a name == response.session_id
>>>> ...
>>>>
>>>> Then I  changed definition of ajx_bug(): form=SQLFORM.factory(Field('
>>>> any', *comment=response.session_id* ), table_name=form_name)
>>>> and here is I got:
>>>>
>>>> Many Ajx Form
>>>> ajx_frm_0:
>>>> Any
>>>> 127.0.0.1-dd2c6b6c-3141-4826-8887-ab1691b67350
>>>> ajx_frm_1:
>>>> Any
>>>> 127.0.0.1-dd2c6b6c-3141-4826-8887-ab1691b67350
>>>> ajx_frm_2:
>>>> Any
>>>> 127.0.0.1-dd2c6b6c-3141-4826-8887-ab1691b67350
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> All ajax responses have the same response_id! i.e. each ajax-process 
>>>> can unlock session file locked by another!
>>>> In other words, requests parallel processing works properly across 
>>>> sessions, but  not within one session, because all responses within 
>>>> session 
>>>> have the same response_id
>>>> It seems, that file is not locked across parallel process (on my Win7 
>>>> at least), may because it is children of one parent or something else?
>>>>
>>>>
>>>>
>>>> On Sunday, August 9, 2015 at 3:28:04 PM UTC+3, Anthony wrote:
>>>>>
>>>>> Does the problem occur only on the first page load of the session? If 
>>>>> so, does the problem go away if you add the following line at the top of 
>>>>> the many_ajx_form function:
>>>>>
>>>>>     session.dummy_data = 'dummy data'
>>>>>
>>>>> If that's the case, then this is the same problem diagnosed in the 
>>>>> original thread, with something like the above as the solution. The 
>>>>> problem 
>>>>> is not that Ajax reads fail to lock the session -- the problem is that at 
>>>>> the very beginning of the session when the initial set of Ajax requests 
>>>>> are 
>>>>> made, there is no session file to lock at all. Adding some dummy data to 
>>>>> the session in the parent page will force a session file to be created, 
>>>>> so 
>>>>> the session file will then exist and therefore be locked when the Ajax 
>>>>> requests come in. Note, this won't work with sessions stored in the DB or 
>>>>> in cookies, as there is no session locking at all with those methods (you 
>>>>> will need some other means to avoid session race conditions in those 
>>>>> cases).
>>>>>
>>>>> Anthony
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to