python多线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python多线程相关的知识,希望对你有一定的参考价值。

 

python 的虚拟机概念:

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

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

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


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

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

 

进程和线程:

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

 

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

 


僵尸进程:

  当进程被执行完成以后,内存没有释放 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的标准

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

 

eg1:

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

"""

 

以上是关于python多线程的主要内容,如果未能解决你的问题,请参考以下文章

python 多线程

python多线程作用

python3.7多线程代码不执行?

python 多线程状态

python多线程探测url地址

python循环怎么用多线程去运行