Flask进程、线程、线程隔离

2021-06-30  本文已影响0人  wyc0859

进程是竞争计算机资源的基本单位
单核CPU 永远只能够执行一个应用程序?答案:是的
但并不是单核不能切换应用,由于cpu执行非常的快,所以开多个应用切换是没问题的
线程是进程的一部分 1个进程可以有多个线程
进程 分配资源 内存资源
线程不能拥有和分配资源,但可以访问进程资源
CPU执行代码是采用线程的方式
python不能充分利用多核CPU优势,但python的多线程并不是鸡肋
由于python的GIL全局全局解释器锁,同一时刻只能在一个CPU核上执行一个线程

使用线程隔离的意义: 使当前线程能够正确引用到他自己所创建的对象,而不是引用到其他线程所
创建的对象

print("************线程测试************")
t=threading.current_thread()
print("主线程:",t.getName()) # 主线程: MainThread

def worker():
    t = threading.current_thread()
    time.sleep(3)
    print("worker:",t.getName())

new_t = threading.Thread(target=worker,name="自定义的线程名")
new_t.start()
new_t2 = threading.Thread(target=worker,name="自定义的线程名2")
new_t2.start()
# 并不会6秒,而是3秒同时出来

Flask开启多线程

默认单进程单线程,开启threaded=True 单进程多线程
多进程,需再来一个参数 process = 5

if __name__ == '__main__':
   app.run(host='0.0.0.0',debug=app.config['DEBUG'],port='81',threaded=True)

Local线程隔离的对象

from werkzeug.local import Local
class A:
    b = 1
#my_obj = A()    # 最后结果是 主3 4 主4,单线程模式,被修改了
my_obj = Local()    #最后结果是 主3 4 主3,多线程,不会被修改
my_obj.b = 3

def worker():
    # 新线程
    my_obj.b = 4
    t = threading.current_thread()
    print(t.getName(),str(my_obj.b))

print('主线程:' + str(my_obj.b))
time.sleep(1)
new_t = threading.Thread(target=worker, name='自定义的线程名')
new_t.start()
time.sleep(1)
print('主线程:' + str(my_obj.b))

当你需要一个对象即是栈结构又是线程隔离时,就用 localstack(线程隔离栈)

from werkzeug.local import LocalStack
my_stack = LocalStack()
my_stack.push(1)
print('主线程:' + str(my_stack.top)) #主线程:1

def worker():
    # 新线程
    print('新线程:' + str(my_stack.top)) #新线程:None
    my_stack.push(2)
    print('新线程--:' + str(my_stack.top)) #新线程--:2

new_t = threading.Thread(target=worker, name='qiyue_thread')
new_t.start()
time.sleep(1)
print('主线程--:' + str(my_stack.top)) #主线程--:1

Flask核心文件

request、session、g都是线程隔离
但current_app不是,隔离了也没作用,所有指向同ID的app核心对象

_request_ctx_stack = Localstack_app_ctx_stack = Localstack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object,'request'))
session = LocalProxy(partial(_lookup_req_object,'session '))
g = LocalProxy(partial(_lookup_app_object,'g'))
上一篇 下一篇

猜你喜欢

热点阅读