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