python 并发编程 多线程与多进程的区别
1.开进程的开销远大于开线程
2 同一进程内的线程共享该进程的数据,进程之间地址空间是隔离的
1 开进程的开销远大于开线程
from multiprocessing import Process def work(): print('hello') if __name__ == '__main__': #在主进程下开启子进程 p = Process(target=work) p.start() print('主进程') ''' 主进程 hello '''
执行结果如下,p.start ()将开启进程的信号发给操作系统后,操作系统要申请内存空间,让好拷贝父进程地址空间到子进程,开销远大于线程
先打印的是主进程
from threading import Thread def work(): print('hello') if __name__ == '__main__': t = Thread(target=work) t.start() print('主线程') ''' hello 主线程 '''
执行结果如下,几乎是t.start ()的同时就将线程开启了,然后先打印出了hello,开线程不用申请内存空间,证明线程的创建开销极小
2 同一进程内的线程共享该进程的数据?
1、进程之间地址空间是隔离的
from multiprocessing import Process def work(): global n n = 0 if __name__ == '__main__': n = 100 p = Process(target=work) p.start() p.join() print('主', n) ''' 主 100 '''
执行结果如下,毫无疑问子进程p已经将自己的全局的n改成了0,但改的仅仅是它自己的,查看父进程的n仍然为100,
子进程不影响主进程
2、同一进程内开启的多个线程是共享该进程地址空间的
# 2 同一进程内的多个线程共享该进程的地址空间 from threading import Thread def work(): global n n = 0 if __name__ == '__main__': n = 100 t = Thread(target=work) t.start() t.join() print('主',n) ''' 主 0 '''
执行结果如下, 查看结果为0, 因为同一进程内的线程之间共享进程内的数据
三 pid
1.开多个进程,每个进程都有不同的pid
current_process 可以查看pid
# 3 pid from multiprocessing import Process from multiprocessing import current_process # current_process 可以查看pid def work(name): print("%s" %name,current_process().pid) # 当前子进程id if __name__ == '__main__': p = Process(target=work, args=("子进程",)) p.start() print('主', current_process().pid) # 主进程id ''' 主 5880 子进程 5092 '''
os模块查看pid
from multiprocessing import Process import os def work(): print("子进程:%s , 父进程:%s" %(os.getpid(), os.getppid())) # 子进程pid if __name__ == '__main__': p = Process(target=work) p.start() print('主', os.getpid()) # 主进程pid ''' 主 15420 子进程:17024 , 父进程:15420 '''
2.在主进程下开启多个线程,每个子线程都跟主进程的pid一样
他们同属一个进程
# 3 pid from threading import Thread import os def work(): print("子线程PID:%s" %(os.getpid())) # 子线程pid if __name__ == '__main__': t = Thread(target=work) t.start() print('主', os.getpid()) # 主线程pid ''' 子线程PID:4328 主 4328 '''