美文网首页
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进程、线程、线程隔离

    进程是竞争计算机资源的基本单位单核CPU 永远只能够执行一个应用程序?答案:是的但并不是单核不能切换应用,由于cp...

  • 进程和线程

    进程: 进程分配内存,且内存是隔离的。至少包括一个线程。 线程: (start /affinity 0x1 jav...

  • 线程和进程概念

    线程和进程 进程 线程 线程和进程的区别

  • 1 多线程基础和Sync

    目录 进程、线程概念 创建线程的方法 线程常用方法 线程同步:Sync 1 进程线程概念 1.1 进程 进程指的是...

  • OC-底层原理 23:多线程原理

    本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理 线程 和 进程 线程和进程的定义 线程 线程时进程...

  • iOS 多线程原理

    本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理 线程 和 进程 线程和进程的定义 线程 线程时进程...

  • iOS底层原理24:多线程原理

    本文的目的在于了解进程、线程、多线程、线程池等的基本概念及原理 线程和进程 线程和进程的定义 线程 线程是进程的基...

  • 线程、多线程、线程池详解

    线程 进程就是在某种程度上相互隔离、独立运行的程序。和进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它...

  • 17_多线程

    =================线程和进程 =============进程 =============线程 ==...

  • 线程

    线程和进程 进程 线程 线程和进程的区别 线程的好处和坏处 创建线程的方式一 线程中常用的方法 代码实例 创建线程...

网友评论

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

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