thread local in python
參考 Thread Locals in Python: Mostly easy
執行緒區域性變數
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
各執行緒獨享自己的變數,但是使用全域性變數 mydata
主執行緒也有自己的執行緒區域性變數
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:Python27lib hreading.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:Python27lib hreading.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 屬性,子執行緒與主執行緒擁有各自的變數
繼承 threading.local
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.10
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