Thanks, Anand.

> In most wsgi adapters, threads are recycled by using a thread pool. So
> it is important to clear all the threadeddict objects used in the
> system to avoid interference with later requests. currently, it is
> done like this:
>
> https://github.com/webpy/webpy/blob/master/web/application.py#L109
>
> I think this can be solved by maintaing the list of instances and
> providing a clear_all method to clear all instances.
>
Very good point -- I'd missed that. How does this look?

    class ThreadedDict(threading.local):
        _instances = []

        @classmethod
        def clear_all(cls):
            for d in cls._instances:
                d.clear()

        def __init__(self):
            self._instances.append(self)

        # ... other methods I gave earlier ...

And then in application._cleanup()

    def _cleanup(self):
        utils.ThreadedDict.clear_all()
 
(IMHO _cleanup should be calling a ThreadedDict class function anyway, 
rather than messing with the _d internals of ThreadedDict.)

And the Session class is extended from ThreadedDict and it is using
> __dict__ for storing some private data. This will fail because of
> that.
>
> https://github.com/webpy/webpy/blob/master/web/session.py#L45
>
> I'm looking in to these issues right now. Will report back once I have
> something ready.
>
 We're not using web.py's session module, but I take it this won't work 
because __dict__ as used here means those items *aren't* thread-local? You 
can actually achieve a similar thing by using __slots__ in a threading.local 
subclass. From Python's standard library _threading_local.py examples:

    Note that subclasses can define slots, but they are not thread
    local. They are shared across threads:

      >>> class MyLocal(local):
      ...     __slots__ = 'number'

      >>> mydata = MyLocal()
      >>> mydata.number = 42
      >>> mydata.color = 'red'

    So, the separate thread:

      >>> thread = threading.Thread(target=f)
      >>> thread.start()
      >>> thread.join()

    affects what we see:

      >>> mydata.number
      11

Thanks,
Ben.

-- 
You received this message because you are subscribed to the Google Groups 
"web.py" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/webpy?hl=en.

Reply via email to