threading.local学习
多线程抢占问题
import time
import threading
obj = 5
def task(arg):
global obj
obj = arg
time.sleep(1)
print(obj)
for i in range(6):
t = threading.Thread(target=task, args=(i,))
t.start()
# 结果
5
5
5
5
5
5
threading.local对象避免线程抢占
为每个线程开辟一块内存空间,存储各自的数据
import time
import threading
obj = threading.local()
def task(arg):
global obj
obj.value = arg
time.sleep(1)
print(obj.value)
for i in range(6):
t = threading.Thread(target=task, args=(i,))
t.start()
# 结果
0
3
4
5
2
1
模拟threading.local
import time
import threading
# 获取线程的唯一标识
from threading import get_ident
class Local():
def __init__(self):
self.storage = {}
def __setitem__(self, key, value):
ident = get_ident()
if ident in self.storage:
self.storage[ident][key] = value
else:
self.storage[ident] = {key:value}
def __getitem__(self, item):
ident = get_ident()
return self.storage[ident][item]
obj = Local()
def task(arg):
obj['num'] = arg
time.sleep(1)
print(obj['num'])
for i in range(6):
t = threading.Thread(target=task, args=(i,))
t.start()
粒度精确到协程
为每个协程开辟一块内存空间,存储各自的数据
import time
import threading
try:
# 获取协程的唯一标识
from greenlet import getcurrent as get_ident
except Exception as e:
from threading import get_ident
class Local():
def __init__(self):
self.storage = {}
def __setitem__(self, key, value):
ident = get_ident()
if ident in self.storage:
self.storage[ident][key] = value
else:
self.storage[ident] = {key:value}
def __getitem__(self, item):
ident = get_ident()
try:
return self.storage[ident][item]
except Exception as e:
return None
obj = Local()
def task(arg):
obj['num'] = arg
time.sleep(1)
print(obj['num'])
for i in range(6):
t = threading.Thread(target=task, args=(i,))
t.start()
作者:Standby — 一生热爱名山大川、草原沙漠,还有我们小郭宝贝!
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/standby/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号