立即学习:https://edu.csdn.net/course/play/24458/296438?utm_source=blogtoedu
线程与进程的区别:
1.消耗区别:进程>线程
1)进程运行结果
#进程运行
from multiprocessing import Process
def task(name):print("我是%s"%name)if __name__ == '__main__':p1 = Process(target=task,args=('子进程',))p1.start()print('主进程')
进程运行结果:
2)线程运行结果
from threading import Thread
def task(name):print("我是%s"%name)if __name__ == '__main__':p1 = Thread(target=task,args=('子线程',))p1.start()print('主线程')
线程运行结果:
3)分析:在两端代码中,除了模块的不一样,代码的顺序都是一样的,但是运行的结果的顺序是不一样的。进程运行中是主进程先打印再打印的子进程,这是因为新建一个进程需要申请内存空间时间较长,而线程恰恰相反。所以进程消耗大于线程。注:同一进程里面的线程是平级的,没有父线程子线程的说法,为了方便理解才说的。
2.地址共享问题:进程之间不共享,同一进程线程之间共享
1)线程之间
from threading import Thread
n = 100
def task(name):
#声明全局变量,并且修改了n的值global nn = 0print("我是%s"%name)if __name__ == '__main__':#开启了一个新的线程,会改变n的值t1 = Thread(target=task,args=('子线程',))t1.start()print('主线程','n=%s'%n)#由于主线程和子线程之间是共享地址空间的即数据,所以线程n的改变也会共享到主线程中
#在主进程下运行了一个主线程和一个子线程(新建的线程)
线程运行结果:
2)进程运行
from multiprocessing import Process
n = 100
def task(name):global nn = 0print("我是%s"%name)if __name__ == '__main__':#开启了一个新的进程p1 = Process(target=task,args=('子进程',))p1.start()print('主进程','n=%s'%n)
#在新的进程中,n的值已经被改变成了0,在主进程中进行n的值的打印,得到的是全局变量n=100,说明进程之间的数据是不共享的,其值的改变包含影响到其他进程值
进程运行结果:
3.pid
查看当前进程pid的方法:
1)multiprocessing.current_process().pid
2)os.getpid()
查看当前进程ppid()的方法:父进程pid
os.getppid()
不同进程pid
from multiprocessing import Process,current_process
n = 100
def task(name):global nn = 0print("我是%s"%name,current_process().pid)if __name__ == '__main__':#开启了一个新的线程p1 = Process(target=task,args=('子进程',))p1.start()print('主进程','n=%s'%n,current_process().pid)
子进程的pid与父进程pid不同
不同线程pid
from threading import Thread
import os
n = 100
def task(name):global nn = 0print("我是%s"%name,os.getpid())if __name__ == '__main__':#开启了一个新的线程t1 = Thread(target=task,args=('子线程',))t1.start()print('主线程','n=%s'%n,os.getpid())
#在主进程下运行了一个主线程和一个子线程(新建的线程)
不同线程pid一样