博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask--偏函数, 线程安全, 请求上下文
阅读量:7240 次
发布时间:2019-06-29

本文共 1705 字,大约阅读时间需要 5 分钟。

一 . 偏函数

from functools import partialdef func(a, b):    return a + bnew_func = partial(func, 3, 4)  # 3,4就是a,b, 也可传*args  **kwargsret = new_func()# 也可以这样写,结果是一样的# new_func = partial(func, 3)  # 这个3是a# ret = new_func(4)  # 这个4是bprint(ret)  # 7

二 . 线程安全

# 当使用公共变量的时候,开启多线程,数据是不安全的, 可能会被修改,    如果数据是安全的,那么下面代码打印的应该0-9不重复且无序import timeimport threadingfrom threading import Threadclass Foo(object):    passfoo = Foo()def func(i):    foo.num = i    time.sleep(1)    print(foo.num, threading.current_thread().ident, foo)for i in range(10):    task = Thread(target=func, args=(i,))    task.start()

  

  解决办法

# 我们既想使用多线程,又想让数据安全,也就是不共享,这里需要用到 localimport timefrom threading import Thread, localimport threadingclass Foo(local):    passfoo = Foo()def func(i):    foo.num = i    time.sleep(1)    print(foo.num, threading.current_thread().ident, foo)for i in range(10):    task = Thread(target=func, args=(i,))    task.start()

  

这里local帮助我们节省了时间,却消耗了空间, 但是这点空间相对于线程执行效率来说不知一提

三 . 请求上下文

  既然谈到了请求上下文,那么我们需要知道一下什么是上下文,说白了就是请求从发起到完成所需要的环境

 

  

Flask中的request不同于Django,它是导入进来的,这个是,也就是说它是全局变量, 为了避免多线程来应用它而导致它产生改变,flask采用了local这个特殊的对象,  这个local对象可以对线程进行隔离,也就是说有了这个local,每个线程对local对象进行修改都不影响其他线程,在请求后,LocalStack栈中会销毁请求上下文对象.实现这种原理就是用线程的ID作为key来保存,每个线程都会找到自己的ID.但是flask用的不是threading.local,而不是werkzeuk的local,因为:  1.werkzeuk自定义的__storage__保存不同线程的状态  2.werkzeuk通过get_ident函数来获取线程标识符(区分用的ID)  3.python3.5以上开始对协程支持,如果用threading.local,可能造成变量在接收时相互干扰,因为一个线程中有多个协程去请求  4.除了local外,werkzeuk还实现了两种数据结构,LocalStack,LocalProxy

 

  现在来看一下请求上下文的过程

服务器框架在接收http请求的时候,去调用app, app在执行run方法的时候,下面执行了werkzeuk模块中的run_simple,werkzeuk触发了flask的__call__方法,__call__方法返回的是wsgi_app,直接执行wsgi_app. # 详细过程见链接:

 

转载于:https://www.cnblogs.com/attila/p/10698958.html

你可能感兴趣的文章
sql 加密解密函数
查看>>
[转]以下划线开头的变量名
查看>>
【转】如何通过Html网页调用本地安卓app?
查看>>
java类加载器 Bootstrap、ExtClassLoader、AppClassLoader的关系
查看>>
四、JVM垃圾回收2(垃圾收集算法)
查看>>
第五次作业
查看>>
Android:数据持久化
查看>>
站立会议01
查看>>
javascript+Struts2解决退出清空session以后,点击后退按钮显示原页面信息的问题
查看>>
Python全栈开发课堂笔记_day03
查看>>
Visio中手绘图形的填充
查看>>
SQL语句中日期相减注意事项
查看>>
实验九 根据材料编程
查看>>
HTTP详解
查看>>
使用WCF和WEBService出现配置的问题
查看>>
layer插件弹出显示圆角
查看>>
C#扫盲之:String字符串的常用方法和冷知识
查看>>
UVA-540 Team Queue
查看>>
迟滞比较器
查看>>
bzoj1816
查看>>