threading.local

Posted zh-xiaoyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了threading.local相关的知识,希望对你有一定的参考价值。

作用:为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离)。

import threading
from threading import local
import time

obj = local()


def task(i):
    obj.xxxxx = i
    time.sleep(2)
    print(obj.xxxxx,i)

for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

threading.get_ident():获取一个线程的唯一标记

import threading

def task(i):
    print(threading.get_ident(),i)

for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

‘‘‘
打印结果:
        14164 0
        35664 1
        43900 2
        18356 3
        31240 4
        24556 5
        27340 6
        46396 7
        20792 8
        31104 9
‘‘‘

根据字典自定义一个类似于threading.local功能

import time
import threading

DIC = {}

def task(i):
    ident = threading.get_ident()
    if ident in DIC:
        DIC[ident][xxxxx] = i
    else:
        DIC[ident] = {xxxxx:i }
    time.sleep(2)

    print(DIC[ident][xxxxx],i)

for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

根据字典自定义一个为每个协程开辟空间进行存取数据

import time
import threading
import greenlet

DIC = {}

def task(i):

    # ident = threading.get_ident()
    ident = greenlet.getcurrent()  #获取协程的唯一标记
    if ident in DIC:
        DIC[ident][xxxxx] = i
    else:
        DIC[ident] = {xxxxx:i }
    time.sleep(2)

    print(DIC[ident][xxxxx],i)

for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

通过getattr/setattr 构造出来 threading.local的加强版(协程)

import time
import threading
try:
    import greenlet
    get_ident =  greenlet.getcurrent
except Exception as e:
    get_ident = threading.get_ident

class Local(object):
    DIC = {}

    def __getattr__(self, item):   #
        ident = get_ident()
        if ident in self.DIC:
            return self.DIC[ident].get(item)
        return None

    def __setattr__(self, key, value):
        ident = get_ident()
        if ident in self.DIC:
            self.DIC[ident][key] = value
        else:
            self.DIC[ident] = {key:value}


obj = Local()

def task(i):
    obj.xxxxx = i
    time.sleep(2)
    print(obj.xxxxx,i)

for i in range(10):
    t = threading.Thread(target=task,args=(i,))
    t.start()

 

以上是关于threading.local的主要内容,如果未能解决你的问题,请参考以下文章

threading.local学习

Flask的Context(上下文)学习记录

Python中threading.local方法

flask上下文管理之threading.local

threading.local

多线程threading.local的作用?