On 08/30/2012 02:32 AM, John Lee wrote:
> Dear all,
>
> I was trying to debug a multi-thead issue. In order to reproduce it, I
> wrote a multi-thread testing in tests.py, but got exception in
> get_renderer('
xxxx.pt'). After some digging, it turns out get_renderer
> will eventually call get_current_registry, which is thread local. So, I
> came out with this hack:
>
> <pre>
> import pyramid.threadlocal
> from threading import Thread, Lock
>
> candidates = [
> (self._test1, ()),
> (self._test2, ()),
> (self._test3, ()),
> ]
>
> def random_func(pyramid_thread_locals):
> pyramid.threadlocal.manager.push(pyramid_thread_locals)
> time.sleep(random.random()) # 0 ~ 1 sec
> func, args = random.choice(candidates)
> func(*args)
>
> pyramid_thread_locals = pyramid.threadlocal.manager.get()
> threads = [Thread(target=random_func, args=(pyramid_thread_locals, ),)
> for i in range(100)]
> for thread in threads:
> thread.start()
> for thread in threads:
> thread.join()
> </pre>
>
> There is no guarantee that pyramid.threadlocal.manager will always be
> there. Even if it's there, there's no guarantee it can be used this way.
> So, this should only be considered as a temporary workaround.
>
> Question: is there a better way to do this?
Is there a better way to do what? What problem are you trying to solve?
Is the above code a bug report?
- C