zoukankan      html  css  js  c++  java
  • 多线程

    1.threading

      查看当前线程

      开启新的线程

    import threading
    
    def worker():
        print('new thread..')
        print(threading.current_thread().getName()) 
    
    if __name__ == '__main__':
        print('hello')
        t = threading.current_thread()
        print(t.getName())  # MainThread
        th1 = threading.Thread(target=worker, name='my Thread')
        th1.start()

    2.锁

      细粒度锁:主动加的锁

      粗粒度锁:解释器加的锁 GIL

     3.webserver

      flask内置的web服务器是单进程、单线程的,不能同时处理多个请求,flask内置的web服务器可以用来调试,测试。

      可以对flask自带的服务器开启多线程模式:

        app.run(threaded=Ture)  【单进程、多线程】

      多线程带来的问题:一个request变量指向多个Request实例。

    解决办法:使用字典,线程隔离,request = { thread1_id:request1,.... }  key为线程的唯一标识

    from werkzeug.local import Local
    
    class A(object):
        a = 100
    
    obj = Local()
    obj.a = 1
    
    def fun():
        obj.a = 20
        print('in new thread obj.a ia', obj.a)
    
    if __name__ == '__main__':
        t = threading.Thread(target=fun, name='mythread')
        t.start()
        time.sleep(1)
        print('in main thread obj.a is' ,obj.a)

      Local模块的原理就是用线程的id作为字典的key    【werkzeug模块】

      LocalStack使用Local的线程隔离栈,每个线程有独立的栈

    LocalStack  -->AppContext   -->FlaskApp

    LocalStack栈push  AppContext、RequestContext

    current_app为栈顶元素的app属性

    request为栈顶元素的request属性

      

  • 相关阅读:
    谈谈程序员、技术主管和架构师
    PyPI教程
    python以下划线开头的变量和函数的作用
    csv和xlsx区别
    编码问题2 utf-8和Unicode的区别
    编码问题1
    洛谷 1404 平均数
    洛谷 1441 砝码秤重
    【模板】高斯消元法
    线段树练习题
  • 原文地址:https://www.cnblogs.com/zhuxiang1633/p/9335001.html
Copyright © 2011-2022 走看看