1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# -*- coding: utf-8 -*-
"""Thread-local/Greenlet-local objects
Thread-local/Greenlet-local objects support the management of
thread-local/greenlet-local data. If you have data that you want
to be local to a thread/greenlet, simply create a
thread-local/greenlet-local object and use its attributes:
>>> mydata = Local()
>>> mydata.number = 42
>>> mydata.number
42
>>> hasattr(mydata, 'number')
True
>>> hasattr(mydata, 'username')
False
Reference :
from threading import local
"""
try:
from greenlet import getcurrent as get_ident
except ImportError:
try:
from thread import get_ident
except ImportError:
from _thread import get_ident
__all__ = ["local", "Local"]
class Localbase(object):
__slots__ = ('__storage__', '__ident_func__')
def __new__(cls, *args, **kwargs):
self = object.__new__(cls, *args, **kwargs)
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident)
return self
class Local(Localbase):
def __iter__(self):
ident = self.__ident_func__()
return iter(self.__storage__[ident].items())
def __release_local__(self):
self.__storage__.pop(self.__ident_func__(), None)
def __getattr__(self, name):
ident = self.__ident_func__()
try:
return self.__storage__[ident][name]
except KeyError:
raise AttributeError(name)
def __setattr__(self, name, value):
if name in ('__storage__', '__ident_func__'):
raise AttributeError(
"%r object attribute '%s' is read-only"
% (self.__class__.__name__, name))
ident = self.__ident_func__()
storage = self.__storage__
try:
storage[ident][name] = value
except KeyError:
storage[ident] = {name: value}
def __delattr__(self, name):
if name in ('__storage__', '__ident_func__'):
raise AttributeError(
"%r object attribute '%s' is read-only"
% (self.__class__.__name__, name))
ident = self.__ident_func__()
try:
del self.__storage__[ident][name]
if len(self.__storage__[ident]) == 0:
self.__release_local__()
except KeyError:
raise AttributeError(name)
local = Local()
if __name__ == '__main__':
def display(id):
1. import time
local.id = id
for i in range(3):
print get_ident(), local.id, "\n"
1. time.sleep(1)
def gree(id):
import gevent
t = []
for i in range(10):
t.append(gevent.spawn(display, "%s-%s" % (id, i)))
gevent.joinall(t)
1. test one
1. l1 = Local()
1. l2 = Local()
1. l.xxx = 1
1. print l.xxx
1. print l1.xxx
1. print l2.xxx
1. test two
1. import gevent
1. t = []
1. for i in range(10):
1. g = gevent.spawn(display, i)
1. t.append(g)
1. gevent.joinall(t)
1. test three
import threading
t = []
for i in range(10):
t.append(threading.Thread(target=gree, args=(i,)))
[th.start() for th in t]
[th.join() for th in t]
|
# -*- coding: utf-8 -*-
from django.dispatch import Signal
from django.conf import settings
from utils.local import local
class AccessorSignal(Signal):
allowed_receiver = 'utils.request_middlewares.RequestProvider'
def __init__(self, providing_args=None):
Signal.__init__(self, providing_args)
def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
receiver_name = '.'.join(
[receiver.__class__.__module__, receiver.__class__.__name__]
)
if receiver_name != self.allowed_receiver:
raise Exception(
u"%s is not allowed to connect" % receiver_name)
if not self.receivers:
Signal.connect(self, receiver, sender, weak, dispatch_uid)
request_accessor = AccessorSignal()
class RequestProvider(object):
"""
@summary: request事件接收者
"""
def __init__(self):
request_accessor.connect(self)
def process_request(self, request):
"""
这里可以在 request 上添加自定义的一些数据、处理逻辑
"""
local.current_request = request
return None
def process_view(self, request, view_func, view_args, view_kwargs):
your_args = view_kwargs.get("your_args", "")
if not your_args:
your_args = (request.POST.get('your_args') or
request.GET.get('your_args')) or ""
request.your_args = your_args
def process_response(self, request, response):
if hasattr(local, 'current_request'):
assert request is local.current_request
del local.current_request
return response
def __call__(self, **kwargs):
if not hasattr(local, 'current_request'):
raise Exception(
u"get_request can't be called in a new thread.")
return local.current_request
def get_request():
if hasattr(local, 'current_request'):
return local.current_request
else:
raise Exception(u"get_request: current thread hasn't request.")
def get_x_request_id():
x_request_id = ''
http_request = get_request()
if hasattr(http_request, 'META'):
meta = http_request.META
x_request_id = (meta.get('HTTP_X_REQUEST_ID', '')
if isinstance(meta, dict) else '')
return x_request_id
|
MIDDLEWARE_CLASSES = (
...
'utils.request_middlewares.RequestProvider',
... )
|
from utils.request_middlewares import local
def my_function():
local.current_request
pass
|
相关推荐
前言 近年来微服务与云原生、CI/CD这些概念被炒得很火,多数应用都会说自己利用了“云”资源,是一个云原生架构的应用。那么云原生到底是什么呢,或者说使用了什么样的技术的应用才能被称之为云原生应用呢? 云计算的兴起 首先云原生是和云计算分不开的,这里的云计算更多的指的是一种云上的资源,而云出现之前,市场还处在一个物理机时代,如果要启用一个新的应用,就得自己搭一台新的服务器,一直到2001年VM出现了
作者: David Porter (Google), Mrunal Patel (Red Hat) Kubernetes 1.25 将 cgroup v2 正式发布(GA), 让 kubelet 使用最新的容器资源管理能力。 什么是 cgroup? 有效的资源管理是 Kubernetes 的一个关键方面。 这涉及管理节点中的有限资源,例如 CPU、内存和存储。 cgroups 是一种可建立资源管理
现在我们需要自定义Prometheus operator,这里以监控ETCD为例。由于我们的etcd是跑在kubernetes外部的,想要监控到,本文章主要介绍k8s二进制安装监控etcd,由于是二进制安装我们需要手动的创建Endpoints以及Service。 除了prometheus operator自带的资源对象,节点以及组件监控,有的时候实际的业务场景需要我们自定义监控项 确保有metri
如何更好地管理我们团队的各种仓库呢? 使用 Docker 官方的 Registry 创建的仓库面临一些维护问题。比如某些镜像删除以后空间默认是不会回收的,需要一些命令去回收空间然后重启 Registry 程序。在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法,最新版本 Nexus3.x 全面支持 Docker 的私有镜像。所以使用 Nexus3.x 一个软件来管理 Docker ,
- 背景 部署简单Go 编译生成的是一个静态可执行文件,除了 glibc 外没有其他外部依赖 并发行好Goroutine 和 Channel 使得编写高并发的服务端软件十分容易。很多情况下,完全不需要考虑锁机制。Go 语言的并发不是以库的形式提供,而是语言层面加入了对并发的支持。 程序员友好与 C/C++ 相比,Go 不支持一些高级语法,代码更简明,同时拥有一些动态语言的特性 执行性能好执行效率
回到顶部