Thanks Armin,
my command below:

On Aug 2, 3:18 pm, Armin Ronacher <armin.ronac...@active-4.com> wrote:
> Hi,
>
> Tired so just the most important parts first.
>
> On Aug 2, 9:21 pm, mdipierro <mdipie...@cs.depaul.edu> wrote:> No there is 
> not. Why do you think there is a race condition?
>
> If the execution of the module takes longer than, say a few minutes,
> the timestamp would be off of course. Long running HTTP requests are
> pretty common these days thanks to stuff like comet.

True. but I would not call it a race condition. We timestamp
everything with the time when a request arrives, not when it is
processed, unless specified otherwise (datetime.now() instead of
request.now)

> > Yes. It was a design decision to be closer to Rails than Django in
> > this respect. I think this is what is making web2py popular, more than
> > anything else.
>
> That's not django/rails that's more python vs ruby.  In Ruby the
> module/require work a lot different to python modules and the rails
> people do have problems with that namespacing there because of the
> silent reopening of classes.
>
> > Can you provide an example of what you mean? I am pretty sure there is
> > no leak.
>
>   _controlled = set()
>   def controlled(f):
>    _controlled.add(f)
>    return f
>
>   from lib import controlled
>
>   @controlled
>   def foo():
>    pass
>
> If that code is reexecuted each time there would be a humongous memory
> leak because over the func_globals even the temporary namespace is
> preserved with everything in it.

True but I believe we never do that in web2py. It is also true that
nothing prevent the user from doing it but the same would be true with
other frameworks.

> > I disagree with "nobody knows how these idioms scale or behave"?
> > We have been doing this for 2 years. We know very well how it works
> > and scales.
> > It actually works very well because as soon as a request is completed
> > the environment is deleted, this is clean, avoids conflicts when
> > multiple apps are running, and prevents memory leaks.
>
> Python is not designed for short running code or throwaway modules.
> Things can leak incredible fast and it's hard to spot.  Here a piece
> of code that would leak the hell out of a web2py application if used
> inside one those throw-away environment things:
>
>   from collections import Container
>   class Foo(object):
>    def foo(self):
>     print "Meh"
>   Container.register(Foo)
>
> That's maybe not the most obvious example because not many people will
> use the ABC registry in those modules, but similar registration
> systems are part of ORMs and many other systems.  Even modules in the
> standard library (csv dialects for instance)
>
> > I do not see the problem. Files are automatically closed when the file
> > object goes out of scope.
> > Can you provide an example when it does not?
>
> There is no such thing as a file going out of scope.  The file is
> closed as part of the object's __del__ method and that might or might
> not be invoked.  In cpython (and only in that python implementation)
> there is a reference counter that often closes files when you think it
> would, but even that's not always the case.  Let me show you an
> example where a file is leaked:
> (Using a fake file here)
>
>   >>> class FakeFile(object):
>   ...  encoding = 'utf-8'
>   ...  write = lambda x, s: None
>   ...  def __del__(self):
>   ...   print "file deleted"
>   ...
>   >>> class SortedLineWriter(object):
>   ...  def __init__(self, func, file):
>   ...   self.func = func
>   ...   self.file = file
>   ...  def write_lines(self, lines):
>   ...   for line in sorted(lines, key=self.func):
>   ...    self.file.write(line)
>   ...
>   >>> def not_closing_directly():
>   ...  f = FakeFile()
>   ...  slw = SortedLineWriter(lambda x: x.decode(slw, 'ignore').lower
> (), f)
>   ...
>   KeyboardInterrupt
>   >>> def not_closing_directly():
>   ...  f = FakeFile()
>   ...  slw = SortedLineWriter(lambda x: x.decode(slw.file.encoding,
> 'ignore').lower(), f)
>   ...  slw.write_lines([])
>   ...
>   >>> import gc
>   >>> not_closing_directly()
>   >>> gc.collect()
>   file deleted
>   5
>
> As you can see, the file is not deleted right now, just after the gc
> ran.  This is standard behavior in pypy, jython and many others. In
> cpython just if refcounting fails.

Yes but because all relevant application code is executed within a
context and there are no references outside the context to stuff
inside the context, when a request is completed, the context is
deleted and everything should be garbage collected.

Anyway. I agree with you it would be better to always close files
explicitly. I will do so unless omebody sends me a patch first.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To post to this group, send email to web2py@googlegroups.com
To unsubscribe from this group, send email to 
web2py+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to