美文网首页
Flask进程、线程、线程隔离

Flask进程、线程、线程隔离

作者: wyc0859 | 来源:发表于2021-06-30 18:11 被阅读0次

    进程是竞争计算机资源的基本单位
    单核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'))
    

    相关文章

      网友评论

          本文标题:Flask进程、线程、线程隔离

          本文链接:https://www.haomeiwen.com/subject/pjirultx.html