• python多线程


     

    python 的虚拟机概念:

    python 虚拟机在模拟单cpu计算机运行的过程进行python代码的运行

    所以python 的虚拟机决定在同一个时间点上,只处理一个任务

    所以真正的并发在python当中并不存在,我们采取的是时间片的形式的异步并发


    全局解释器锁的概念:(为保证上面特性)

    当一个事件运行被加锁以后,在该事件的锁被
    释放之前,其他事件无法打断该事件的运行。

    #GIL  全局解释器锁的存在导致cpu密集型的任务在python中不适合使用多线程
    # 在同一时刻只能有一个线程进入到Cpython的解释器
    # 单核时代 GIL的弊端没有展现出来
    #python 的多线程 并不是真正意义上的多线程

     

    #thread
    #解释器:Cpython (GIL)
    #os
    #cpu1,cpu2 ..

    #IO密集型:
    # python中可以使用多线程实现并发
    # 存在阻塞状态就可以通过切换充分利用cpu

    #CPU密集型:
    # python 中 没太好的办法
    #可以考虑使用C语言实现

    进程和线程:

    进程都有自己独立的内存空间,进程之间进行数据的通信不是很方便
    同一个进程下的线程共享该进程的内存空间,所以数据交互比较方便,
    但是也容易导致全局变量的莫名修改

     

    多线程的几个概念:
    指针 每个线程都必须有指针指出该线程执行的环境(顺序,执行,结束)
    中断 线程在运行的过程中被抢占,中断
    休眠 线程运行的过程当中挂起,叫做休眠
    让步 一个线程让其他线程先进行运行

     


    僵尸进程:

      当进程被执行完成以后,内存没有释放 kill

      当我们运行一个进程,进程结束,线程没有结束的时候,
        1、进程关闭,线程被强制关闭
        2、进程关闭,线程依然占用内存进行运行,没有关闭,
       当线程执行完成以后,没有方法或者措施进行内存释放
       形成了僵尸进程

     

    守护线程:
    所以在这个时候我们会安排一个线程作为守护线程,守护线程会在最后被执行
    如果守护线程没有执行,进程不可以关闭

     

    python 多线程的模块
      #2.x
      #thread
      #threading
      #3.x
      #_thread
      #threading

     

    一、thread模块:

     

    eg1:

    #抢占屏幕,僵尸进程

    import _thread
    from time import sleep,ctime
    a_list=[4,2]
    def deamo(ids,num):
      print("deamo%s is start at : %s" %(ids,ctime()))
      sleep(num)
      print("deamo%s is done at : %s" %(ids,ctime))
    def main(c_list):
      print("main is start at: %s" %ctime())
      for ids,num in enumerate(c_list):
        _thread.start_new_thread(deamo,(ids,num))
        sleep(4)
      print("main is done at: %s" %ctime())
    if __name__ == "__main__":
    main(a_list)

     

    二、threading模块:

    threading 继承重写了thread,支持守护线程
    threading 通过自己的下面的Thread方法创建线程
    并且给出方法 start用来开启线程,join用来挂起线程
    getName 获取线程的名称
    setName 设置线程的名称
    isAlive 判断线程的状态
    isDaemon 返回线程daemon的标准
    setDaemon 设置daemon的标准。设置了setDaemon的线程执行优先级会变低。

      如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止
      如果是前台线程(默认),主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止

      设置daemon一定要在多线程运行之前

    join 让该线程阻塞住

    run  自动执行线程对象的run方法

     

    eg1:

    import threading
    import time

    def deamo(arg):
      time.sleep(1)
      print("thread %s" %arg)

    for i in range(10):
      t=threading.Thread(target=deamo,args=(i,))
      t.start()
      # t.join()

    print("main thread is stop")

     

    eg2

    import threading
    from time import sleep,ctime
    a_list=[4,2]
    def deamo(ids,num):
      print("deamo%s is start at : %s" %(ids,ctime()))
      sleep(num)
      print("deamo%s is done at : %s" %(ids,ctime))
    def main(c_list):
      thread_list=[]
      print("main is start at: %s" %ctime())
      for ids,num in enumerate(c_list):
        t = threading.Thread(target=deamo,args=(ids,num))   #生成线程
        t.setName("deamo%s" %ids)
        #print(t)
        #print(t.getName())
        thread_list.append(t)

      for i in thread_list:
        i.start()              #开启线程
      for i in thread_list:

        i.join()        #挂起线程
      print("main is done at:%s"%ctime())
    if __name__ == "__main__":
      main(a_list)

     

    """

    L=[4,2]
    for i,j in enumerate(L):
      print(i)
      print(j)

    0
    4
    1
    2

    """

     

    eg3:线程锁

    import threading
    import time

    a = 0

    lock = threading.RLock()

    def deamo():
      lock.acquire()
      global a
      time.sleep(1)
      a += 1
      print(a)
      lock.release()
    for i in range(10):
      t=threading.Thread(target=deamo)
      t.start()

    print("main thread is stop")

     

  • 相关阅读:
    C#Web网站的创建
    C#Repeater控件的使用
    C#LINQ
    C#异常处理
    C#LINQ
    C#匿名委托,匿名函数,lambda表达式
    C#chart图表的应用
    C#用户控件的使用
    用 Python写 daemon
    CentOS 5.4 制作 Python 2.6 RPM 包的方法
  • 原文地址:https://www.cnblogs.com/fanxuanhui-linux/p/5958455.html
Copyright © 2020-2023  润新知