进程与线程的区别
一 开启线程速度快于进程
开进程的开销远大于开线程
进程
# 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

浙公网安备 33010602011771号