參考 Thread Locals in Python: Mostly easyhtml
import threading mydata = threading.local() mydata.x = 'hello' class Worker(threading.Thread): def run(self): mydata.x = self.name print mydata.x w1, w2 = Worker(), Worker() w1.start(); w2.start(); w1.join(); w1.join()
Thread-1 Thread-2
各線程獨享本身的變量,可是使用全局變量 mydatapython
import threading mydata = threading.local() mydata.x = {} class Worker(threading.Thread): def run(self): mydata.x['message'] = self.name print mydata.x['message'] w1, w2 = Worker(), Worker() w1.start(); w2.start(); w1.join(); w2.join()
Exception in thread Thread-1: Traceback (most recent call last): File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner self.run() File "E:/learn/python/test/thread_local.py", line 15, in run mydata.x['message'] = self.name AttributeError: 'thread._local' object has no attribute 'x' Exception in thread Thread-2: Traceback (most recent call last): File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner self.run() File "E:/learn/python/test/thread_local.py", line 15, in run mydata.x['message'] = self.name AttributeError: 'thread._local' object has no attribute 'x'
線程 w1,w2 沒有 x 屬性,子線程與主線程擁有各自的變量bootstrap
import threading class MyData(threading.local): def __init__(self): self.x = {} mydata = MyData() class Worker(threading.Thread): def run(self): mydata.x['message'] = self.name print mydata.x['message'] w1, w2 = Worker(), Worker() w1.start(); w2.start(); w1.join(); w2.join()
Thread-1 Thread-2
bottle 0.4.10this
class Request(threading.local): """ Represents a single request using thread-local namespace. """ def bind(self, environ): """ Binds the enviroment of the current request to this request handler """ self._environ = environ self._GET = None self._POST = None self._GETPOST = None self._COOKIES = None self.path = self._environ.get('PATH_INFO', '/').strip() if not self.path.startswith('/'): self.path = '/' + self.path #---------------------- request = Request() #---------------------- def WSGIHandler(environ, start_response): """The bottle WSGI-handler.""" global request global response request.bind(environ) response.bind() try: handler, args = match_url(request.path, request.method) if not handler: raise HTTPError(404, "Not found") output = handler(**args) except BreakTheBottle, shard: output = shard.output