首页 > 其他分享 >Flask的线程,携程与并发 (2)

Flask的线程,携程与并发 (2)

时间:2023-08-01 22:33:12浏览次数:37  
标签:ident get Flask self 携程 storage 线程 import def

Flask的线程,携程与并发 (2)

pipreqs:

- 项目依赖 pip3 install pipreqs
- 生成依赖文件:pipreqs ./ 
- 安装依赖文件:pip3 install -r requirements.txt 

函数和方法

from types import MethodType,FunctionType

class Foo(object):
	def fetch(self):
		pass

print(isinstance(Foo.fetch,MethodType))
print(isinstance(Foo.fetch,FunctionType)) # True

obj = Foo()
print(isinstance(obj.fetch,MethodType)) # True
print(isinstance(obj.fetch,FunctionType))

threading.local

多个线程修改同一个数据,复制多份变量给每个线程用,为每个线程开辟一块空间进行数据存储

不用threading.local

# 不用local
from threading import Thread
import time
lqz = -1
def task(arg):
    global lqz
    lqz = arg
    # time.sleep(2)
    print(lqz)

for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

threading.local使用

from threading import Thread
from threading import local
import time
from threading import get_ident
# 特殊的对象
lqz = local()
def task(arg):
    # 对象.val = 1/2/3/4/5
    lqz.value = arg
    time.sleep(2)
    print(lqz.value)
for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

通过字典自定义threading.local(函数)

from threading import get_ident,Thread
import time
storage = {}
def set(k,v):
    ident = get_ident()
    if ident in storage:
        storage[ident][k] = v
    else:
        storage[ident] = {k:v}
def get(k):
    ident = get_ident()
    return storage[ident][k]
def task(arg):
    set('val',arg)
    v = get('val')
    print(v)

for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

面向对象版

from threading import get_ident,Thread
import time
class Local(object):
    storage = {}
    def set(self, k, v):
        ident = get_ident()
        if ident in Local.storage:
            Local.storage[ident][k] = v
        else:
            Local.storage[ident] = {k: v}
    def get(self, k):
        ident = get_ident()
        return Local.storage[ident][k]
obj = Local()
def task(arg):
    obj.set('val',arg) 
    v = obj.get('val')
    print(v)
for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

通过setattr和getattr实现

from threading import get_ident,Thread
import time
class Local(object):
    storage = {}
    def __setattr__(self, k, v):
        ident = get_ident()
        if ident in Local.storage:
            Local.storage[ident][k] = v
        else:
            Local.storage[ident] = {k: v}
    def __getattr__(self, k):
        ident = get_ident()
        return Local.storage[ident][k]
obj = Local()
def task(arg):
    obj.val = arg
    print(obj.val)
for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

每个对象有自己的存储空间(字典)

from threading import get_ident,Thread
import time
class Local(object):
    def __init__(self):
        object.__setattr__(self,'storage',{})
    def __setattr__(self, k, v):
        ident = get_ident()
        if ident in self.storage:
            self.storage[ident][k] = v
        else:
            self.storage[ident] = {k: v}
    def __getattr__(self, k):
        ident = get_ident()
        return self.storage[ident][k]
obj = Local()
def task(arg):
    obj.val = arg
    obj.xxx = arg
    print(obj.val)
for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

兼容线程和协程

try:
    from greenlet import getcurrent as get_ident
except Exception as e:
    from threading import get_ident
from threading import Thread
import time
class Local(object):
    def __init__(self):
        object.__setattr__(self,'storage',{})
    def __setattr__(self, k, v):
        ident = get_ident()
        if ident in self.storage:
            self.storage[ident][k] = v
        else:
            self.storage[ident] = {k: v}
    def __getattr__(self, k):
        ident = get_ident()
        return self.storage[ident][k]
obj = Local()
def task(arg):
    obj.val = arg
    obj.xxx = arg
    print(obj.val)
for i in range(10):
    t = Thread(target=task,args=(i,))
    t.start()

partial偏函数

#偏函数的第二个部分(可变参数),按原有函数的参数顺序进行补充,参数将作用在原函数上,最后偏函数返回一个新函数
from functools import partial
def test(a,b,c,d):
    return a+b+c+d

tes=partial(test,1,2)
print(tes(3,4))

session源码分析

SecureCookieSessionInterface
	-open_session
	-save_session

标签:ident,get,Flask,self,携程,storage,线程,import,def
From: https://www.cnblogs.com/joseph-bright/p/17599320.html

相关文章

  • Flask数据库连接(了解)
    Flask数据库连接(了解)g对象#g:global缩写,是关键字,不能用,就写成了g,对象,是一个全局对象,当此请求过程中,一直有效#作用:上下文 -其实是请求的上下文,从请求进来,就有,到请求走了,一直存在,所以在当次请求过程中,如果调用别的函数,不需要把参数传入,只需要放到g对象中,在别的函数中直接使......
  • Flask的线程,携程与并发
    Flask的线程,携程与并发并发编程#1操作系统发展史#2进程基础:操作系统上运行的程序,是资源分配的最小单位#3进程调度:时间片轮转法#4并发和并行#5同步,异步,阻塞,非阻塞#6python创建进程 -两种方式: -类继承:Process,重写run方法-Process(target=任务)......
  • Flask的请求,响应简介
    Flask的请求,响应简介Flask的请求与响应请求对象defindex():#请求对象,是全局的,需要导入,这个全局的request,在哪个视图函数中,就是当次的request对象,不会乱#request.method提交的方法print(request.method)#request.argsget请求提及的数据prin......
  • Flask初体验
    pipinstallflask--upgrade强制更新至最新版本 fromflaskimportFlaskapp=Flask(__name__)@app.route('/',methods=['GET'])defindex():return'helloworld'if__name__=='__main__':app.run()__name__:就是......
  • CPU的几核几线程是什么意思?
    前言经常看到电脑硬件的配置参数上是这么标注cpu的是不是不太明白是什么意思?命名介绍每个cpu型号都有自己名字,比如上边举例的那款叫做i5-12600ki5指得是英特尔公司把自家cpu划分为三六九等,i3是低端、i5是中端、i7是高端、i9是至尊顶配。12指的是12代的处理器,其中后......
  • 什么是gil锁、python的垃圾回收机制是什么样的?解释为什么计算密集型用多进程,io密集型
    目录1什么是gil锁-全局解释器锁:gil锁的作用是什么?为什么要有gil锁?2python的垃圾回收机制是什么样的?-引用计数-标记清除-分代回收3解释为什么计算密集型用多进程,io密集型用多线程计算密集型任务:I/O密集型任务:总结:1什么是gil锁-全局解释器锁:它的本质就是一个大的互斥锁,它......
  • java 解决线程安全的两种方式(Synchornized和Lock)
    java解决线程安全的两种方式(Synchornized和Lock)原文链接:https://www.cnblogs.com/MrFugui/p/15610780.htmlsynchornized与lock的不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器lock需要手动的启动同步(Lock()),同时结束同步也需要使用手动的实现(unlock())......
  • ThreadPoolExecutor来创建和执行线程池的基本步骤
    ThreadPoolExecutor是Java提供的一个线程池实现,它提供了对线程池的更灵活和精细的控制。可以通过ThreadPoolExecutor来管理和执行多个线程任务,以提高应用程序的性能和效率。下面是使用ThreadPoolExecutor来创建和执行线程池的基本步骤:创建一个ThreadPoolExecutor实例,可以通过Thread......
  • 登录认证装饰器,flask配置文件,路由系统
    0登录认证装饰器#0装饰器的本质原理 -#类装饰器:1装饰类的装饰器2类作为装饰器#1装饰器使用位置,顺序#3flask路由下加装饰器,一定要加endpoint -如果不指定endpoint,反向解析的名字都是函数名,不加装饰器没有问题,就是正常函数index,detail-如果加了装饰器---》in......
  • 线程同步的几种方法
    线程同步的方式   线程同步有:临界区、互斥区、事件、信号量四种方式临界区(CriticalSection)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进......