老男孩视频——flask线程、协程

request

(1)单进程单线程:通过导入的形式一定不会出问题。 基于全局变量做
(2)单进程多线程:服务端运行起来之后,客户端1的请求过来,用一个线程去处理它,客户端2的请求过来,用另一个线程去处理。并发的处理请求,如果request的值用的全局变量,任何一个线程都能更改request的值。threading.local对象,为每个线程开辟一块空间来保存它独有的值,进行数据存储(数据隔离)。 threading.local可以给每个线程开辟空间,原理就是通过线程的唯一标识来做。如果想i支持协程,就要通过greenlet 去获取协程的唯一标识。
(3)单进程单线程(一个线程可以开多个协程,可以共享资源)threading.local对象做不到。。对于客户端的请求,可以创建一个协程进行处理。处理过程中如果协程遇到IO 请求,可以让该客户端请求去另一个协程继续进行处理,

注意:(1)若不支持协程,则用threading.local对象
(2)若支持协程,则可以自定义类似threading.local对象

协程

  1. 可以获取一个线程的唯一标识:

from _thread import get_ident
get_ident() # 调用这个函数就可以获得唯一标识

  1. 可以获得协程的唯一标识:

from greenlet import getcurrent as get_ident

设置和读取属性的值

class Foo(object):

    def __setattr__(self, key, value):
        print(key, value)

    def __getattr__(self, item):
        print(item)


obj = Foo()
obj.z = 300
obj.w

自定义类似threading.local的对象

from greenlet import getcurrent as get_ident
防止反复调用 生成递归
class Local(object):
	def __init__(self):
		object.__setattr__(self, 'storage',{})
        # self.storage = {}				# 设置值
        
	def __setattr__(self, key, value):
        print(key, value)

如果调用了 对象.xx 会触发__setattr__方法

  def __setattr__(self, key, value):
        print(key, value)

猜你喜欢

转载自blog.csdn.net/xili2532/article/details/91450648