Flask前戏之threading.local

作用:单独给每个线程创建一个内存空间存储变量,依次完成数据隔离。

from threading import Thread, local
import time

# v = 0
obj = local()

def task(i):
    # global v
    # v = i

    # 单独给每个线程创建一个内存空间存储变量
    obj.xxx = i
    time.sleep(1)
    # print(v)
    print(obj.xxx)


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

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

import threading
import time

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

DICT = {}


def task(i):
    ident = threading.get_ident()  # 线程的唯一标识

    # 若初次进入线程,设置键值对
    if not ident in DICT:
        DICT[ident] = {'key':i}

    # 再次进入则修改键值对
    else:
        DICT[ident]['key'] = i
    time.sleep(2)

    print(DICT[ident]['key'])


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

升级版:

import threading
import time


class Local(object):
    DIC = {}

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

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


obj = Local()

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


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

猜你喜欢

转载自www.cnblogs.com/fqh202/p/9585407.html