首页 > 代码库 > python多线程
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多线程