同一个时刻,某个线程只能干同一件事,但在一段时间内,可以有很多线程干很多事。
并行指同一个cpu在一段时间内雨露均沾地执行程序
并行指多个cpu干不同的事情。
进程就是一个执行的程序,进程和进程之间相隔,没有关系
进程
举个多进程的例子:
下面的代码是计算两次睡眠的耗时
import time
import random
def fun():
time.sleep(random.randint(1,3))
if __name__ == '__main__':
s_time=time.time()
fun()
fun()
e_time=time.time()
print(e_time-s_time)
结果:
建立进程后:
import time
from multiprocessing import Process
def fun():
time.sleep(3)
if __name__ == '__main__':
s_time=time.time()
p1 = Process(target=fun)#target 指定任务(注意fun没有括号),创建子进程
p1.start()
fun()
e_time=time.time()
print(e_time-s_time)
结果:
原因是两个fun函数分开执行了,可能是并行也可能是并发。如果进程少于cpu时,系统选择并行。
再举个例子:
import time
from multiprocessing import Process
def fun1(a,b):
time.sleep(2)
res=a+b
print(res)
if __name__ == '__main__':
s_time=time.time()
p1 = Process(target=fun1,args=(2,2))
p1.start()
fun1(1,1)
e_time=time.time()
print(e_time-s_time)
结果:
可以看出两个fun1是同时出结果的。
线程
操作系统不会直接操作线程,它是由python解释器来调度的,而且多线程不能并行,因为GIL锁,和Java类似,是为了保证线程安全。
举个例子:
from threading import Thread
import time
def fun():
print("任务开始了")
time.sleep(2)
if __name__ == "__main__":
s_time=time.time()
t1=Thread(target=fun)
t1.start()
fun()
e_time=time.time()
print(e_time-s_time)
结果:
可以看出两个fun并发执行
在任意一个进程里,只能执行一个线程。这个道理很明显,因为一个cpu只能执行一个进程,每时每刻只有一个线程在运行,但是cpu可以雨露均沾。