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")

 

posted @ 2016-10-13 22:33  xuanhui  阅读(194)  评论(0)    收藏  举报