1 . 偏函數 (partial) 最終得到的結果為: ( (1, 2, 3, 4) , {'a': 3, 'b': 5} ) 我理解的意思為: 將1,2,3,4,a=3,b=5傳入func中去執行函數. 其實就是 :往函數里傳一個值不執行,返回一個新函數 2.ThreadingLocal線程安全 ...
1 . 偏函數 (partial)
from functools import partial def func(*args,**kwargs): a=args b=kwargs return a,b new_func=partial(func,1,2,3,4,a=3,b=5) ret=new_func() print(ret)
最終得到的結果為: ( (1, 2, 3, 4) , {'a': 3, 'b': 5} )
我理解的意思為: 將1,2,3,4,a=3,b=5傳入func中去執行函數.
其實就是 :往函數里傳一個值不執行,返回一個新函數
2.ThreadingLocal線程安全 空間轉時間
我們之前學的線程併發是這樣的
from threading import Thread import threading
class foo(object): pass f=foo() def func(a): f.num=a time.sleep(1) print(f.num,threading.current_thread().ident) for i in range(10): t=Thread(target=func,args=(i,)) t.start()
但是這樣我們列印的結果為
原因是線程的創建速度是很快的(一瞬間),在第一個a進入函數執行時,睡眠了1秒,io切換到下一個時,又睡眠,直到最後一個進入函數,第一個a還在睡眠.當第一個結束睡眠的時候,num已經變成了最後一個值,所以每一個num都變成了最後一個數字9.
解決方法:(只要在類中繼承一個local即可)
from threading import local import threading class Foo(local): pass f=Foo() def func(i): f.num=i time.sleep(1) print(f.num,threading.current_thread().ident) for i in range(10): t=Thread(target=func,args=(i,)) t.start()
3.myLocalStack
import time from threading import Thread,local import threading class MyLocalStack(local): stack={} pass mls=MyLocalStack() def func(i): a=threading.current_thread().ident mls.stack[a]=[f'r{i+1}',f's{i+1}'] time.sleep(1) print(mls.stack[a].pop(),mls.stack[a].pop(),a) mls.stack.pop(a) print(mls.stack,a) if __name__ == '__main__': for i in range(10): t=Thread(target=func,args=(i,)) t.start()
4.RunFlask + request
視圖函數 : 根據一個路由地址指向一個函數,這個函數就叫視圖函數
app.run()的原理:
app.run()實際上執行的是app裡面的run_simple方法,
而run_simple方法調用的是裡面的__call__()方法,而__call__中返回了一個wsgi_app()方法
run_simple方法裡面需要的參數有(host,port,func,**options)
參數:
host : 伺服器的ip地址
port : 伺服器埠
func : 當請求過來的時候,執行func函數
options : 傳參參數
具體實例代碼如下:
from werkzeug.serving import run_simple
from werkzeug.wrappers import Response,Request
@Request.application
def app(req):
if req.path == '/login':
return login(req)
return Response('200 OK')
def login(res):
return Response('歡迎來到登陸頁面')
run_simple('127.0.0.1',8888,app)
req的意思就是request,他是werkzeug裡面的用法,記住就行
5.請求上文
請求上文的意思是: 你怎麼將app,request,session放進去的
首先我們要清楚,run方法實際上執行的是__call__方法,而通過源碼我們發現__call__實際上返回的是一個wsgi_app的方法
返回到wsgi_app中
我們得到了ctx返回了一個request_context對象,對象裡面有 --> app, request , session
最後得到結果: top是LocalStack中的top方法
到這裡我們回顧之前一個學習的知識:
class Foo(object): def __call__(self, *args, **kwargs): print("我是可以執行的對象") def __setattr__(self, key, value): print(key,value) def __getattr__(self, item): print(item) f=Foo()
#對象加括弧 : 調用哪個__call__方法
f.num #這裡實際上執行的是__getattr__方法,如果我們在上面沒有寫這個函數,那麼會報錯 #以上列印的結果為 num f.num=1 #這裡實際上執行的是__setattr__方法 #以上列印的結果為 num , 1
所以在上面我們發現 _local.stack[-1] ,所以我們是不是要找_local是不是有__getattr__方法呀
所以最後我們得到的 top結果為 None.
最後返回的rv:
到這裡,請求上文也就結束了
6.請求下文
請求下文是你怎麼將app,request,session拿出來調用的
請求下文是在你執行視圖函數的時候才開始運行的
請求下文是執行函數的時候,request.方法或者使用到session的時候才到了請求下文的內容
因為我們之前request.method 所以執行了__getattr__方法