进程与线程的区别
一 开启线程速度快于进程
开进程的开销远大于开线程
进程
# 1、开进程的开销远大于开线程的 import time from multiprocessing import Process def work(name): print("%s is working " % name) time.sleep(2) print("%s end" % name) if __name__ == "__main__": p1 = Process(target=work, args=("进程1", )) p1.start() # print("主线程")打印完了,子进程才起来 print("主进程")
执行结果
主进程
进程1 is working
进程1 end
线程
import time from threading import Thread def work(name): print("%s is working " % name) time.sleep(2) print("%s end" % name) if __name__ == "__main__": t1 = Thread(target=work, args=("线程1", )) t1.start() # 指令发出,效果立马出现 print("主线程")
执行结果
线程1 is working
主线程
线程1 end
二 同一进程内的线程共享该进程的数据
1、进程之间地址空间是隔离的
from multiprocessing import Process n = 100 def task(): global n n = 0 if __name__ == "__main__": p1 = Process(target=task,) p1.start() # 主进程n=100,子进程n=0(改的是子进程的,不影响主进程) p1.join() print("主进程", n)
执行结果如下,毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100
主进程 100
2、同一进程内开启的多个线程是共享该进程地址空间的
from threading import Thread n = 100 def task(): global n n = 0 if __name__ == "__main__": t1 = Thread(target=task, ) t1.start() # 发信号后,在同一进程中开了一个线程,共享进程资源 t1.join() print("主线程", n)
执行结果如下, 查看结果为0,因为同一进程内的线程之间共享进程内的数据
主 0
三 查看pid
1、在主进程下开启多个线程,每个线程都跟主进程的pid一样
from threading import Thread import os def task(): print("线程1PID:%s " % os.getpid()) if __name__ == "__main__": t1 = Thread(target=task, ) t1.start() print("主线程", os.getpid())
执行结果
线程1PID:6436
主线程 6436
2、开多个进程,每个进程都有不同的pid
from multiprocessing import Process, current_process import os def task(): # print(current_process().pid) print("子进程PID:%s | 父进程PID:%s" %(os.getpid(), os.getppid())) if __name__ == "__main__": p1 = Process(target=task,) p1.start() # print("主进程", current_process().pid) print("主进程", os.getpid())
执行结果
主进程 6232
14912
子进程PID:14912 | 父进程PID:6232