python中线程和进程的简单了解
一、操作系统、应用程序
1.硬件:硬盘、cpu、主板、显卡........
2.装系统(本身也是一个软件):
系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合。
3.安装软件:各种应用程序
二、并发和并行
并发:伪,由于执行速度特别快,人感觉不到停顿
并行:真,创建多个对象同时操作
三、线程、进程
1.单进程、单线程的应用程序
print("asd")
2.到底什么是线程、进程
python中没有这两个,是python调用的操作系统的线程和进程
3.单进程、多线程的应用程序
import threading #两个进程 print("start") def func(arg): print(arg) t = threading.Thread(target=func,args=("......",)) t.start() print("end") # start # ...... # end
import threading class MyThread(threading.Thread): def run(self): print(11111,self._args,self._kwargs) #******** t1 = MyThread(args=(11,)) t1.start() print("end") # 11111 (11,) {} # end
python多线程情况下:
计算密集型操作:效率低(GIL锁)
IO操作:效率高
python多进程的情况下:
计算密集型:效率高(浪费资源)
IO操作:效率高(浪费资源)
在使用时:
IO密集型用多线程:文件、输入、输出、socket网络通信
计算密集型用多进程
四、python中线程和进程(GIL锁)
GIL锁,全局解释器锁,用于限制一个进程中同一时刻只有一个线程被cpu调度。
扩展:默认GIL锁在执行100个cup指令(过期时间)
setDaemon(True) 若为Ture 则会直接运行主线程,不用等待
1 import threading 2 import time 3 def func(a): 4 time.sleep(2) 5 6 print(a) 7 s1=threading.Thread(target=func,args=(1,)) 8 s1.setDaemon(True) 9 s1.start() 10 s2=threading.Thread(target=func,args=(2,)) 11 s2.setDaemon(False)#只要两个 12 s2.start()
join的使用
join是限制主线程等待子线程的时间,等够了就不再等子线程执行结束,主线程接着执行,没等够主线程就会停下等待,并不是时间到了程序停止的意思
1 import time#让主线程等待 2 import threading 3 def func(a): 4 time.sleep(2) 5 print(a) 6 print("创建t1") 7 t1=threading.Thread(target=func,args=(1,)) 8 9 t1.start() 10 t1.join(1) 11 print("创建t2") 12 t2=threading.Thread(target=func,args=(2,)) 13 14 t2.start() 15 t2.join(1) 16 print(123)
获取名字
1 import threading#或取名字 2 def func(arg): 3 t=threading.current_thread()#创建对象 4 name=t.getName()#直接查找名字哦 5 print(name,arg) 6 t1=threading.Thread(target=func,args=(1,)) 7 t1.setName("张庆") 8 t1.start() 9 print(123)
加锁:
1 import threading 2 import time 3 lock = threading.RLock() 4 5 n = 10 6 7 def task(i): 8 print('这段代码不加锁',i) 9 10 lock.acquire() # 加锁,此区域的代码同一时刻只能有一个线程执行 11 #这题区域分为加锁前和后 先按顺序执行加锁前面的代码,一旦发现加锁 12 #就直接执行这一个线程的代码>>>执行prient 13 #执行后执行加锁后面的代码,需要解锁 才可以实现 14 #解锁后也是根据这一课一线程的代码一步一步解锁 15 # 16 global n 17 print('当前线程',i,'读取到的n值为:',n) 18 n = i 19 time.sleep(1) 20 print('当前线程',i,'修改n值为:',n) 21 lock.release(), 22 23 for i in range(10): 24 t = threading.Thread(target=task,args=(i,)) 25 t.start()