thread local in python

bigfish發表於2019-02-16

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

相關文章