一 local 和 偏函数
1. local
local多个线程修改同一个数据,复制多份变量给每个线程用,
比如我们用的request,怎样让不同的请求有自己的request。就是为每个线程开辟一块空间进行数据存储
threading.local【和flask无任何关系】
作用:为每个线程创建一个独立的空间,使得线程对自己的空间中的数据进行操作(数据隔离)。
不用threading.local
from threading import Thread import time ctx = -1 def task(arg): global ctx ctx = arg # time.sleep(2) print(ctx) for i in range(5): t = Thread(target=task,args=(i,)) t.start() # 0 # 1 # 2 # 3 # 4
使用threading.local
from threading import Thread,local # 特殊的对象 ctx = local() def task(arg): ctx.value = arg # time.sleep(2) print(ctx.value) for i in range(5): t = Thread(target=task,args=(i,)) t.start() # 0 # 1 # 2 # 3 # 4
import threading from threading import local def task(i): print(threading.get_ident(),i) # 获取每个线程唯一id for i in range(5): t = threading.Thread(target=task,args=(i,)) t.start() # 14896 0 # 10780 1 # 3356 2 # 11384 3 # 14308 4
import threading from threading import local import time obj = local() def task(i): obj.xxxxx = i print(threading.get_ident(), obj.xxxxx,"拉拉") time.sleep(2) # print(obj.xxxxx,i) print(threading.get_ident(),i,"哈哈") for i in range(5): t = threading.Thread(target=task,args=(i,)) t.start() # 6232 0 拉拉 # 4348 1 拉拉 # 7084 2 拉拉 # 972 3 拉拉 # 6560 4 拉拉 # 6232 0 哈哈 # 6560 4 哈哈 # 972 3 哈哈 # 4348 1 哈哈 # 7084 2 哈哈
通过字典自定义threading.local(函数) 方法一
import time import threading import greenlet DIC = {} def task(i): # ident = threading.get_ident() ident = greenlet.getcurrent() if ident in DIC: DIC[ident]['aa'] = i else: DIC[ident] = {'aa':i } time.sleep(2) print(DIC[ident]['aa'],i) for i in range(5): t = threading.Thread(target=task,args=(i,)) t.start() print(DIC)