码迷,mamicode.com
首页 > 其他好文 > 详细

threading.local

时间:2020-07-03 21:07:57      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:oca   exception   功能   getc   etc   lse   reading   for   作用   

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

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

标签:oca   exception   功能   getc   etc   lse   reading   for   作用   

原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/13232536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!