python:父进程、子进程、线程的原理以及创建

妖狐艹你老母 2023-01-02 04:21 391阅读 0赞

1、父子进程之间的关系
假设是a进程创建了b进程,那么a进程就是b进程的父进程。反之,假设是b创建了a,那么b进程就是a的父进程。
关于资源:子进程得到的是除了代码段是与父进程共享的意外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,既然为副本,也就是说,二者并不共享地址空间。两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。(采用写时复制技术)
关于文件描述符:继承父进程的文件描述符时,相当于调用了dup函数,父子进程共享文件表项,即共同操作同一个文件,一个进程修改了文件,另一个进程也知道此文件被修改了。
2、线程与进程之间的关系
一个进程的线程之间共享由进程获得的资源,但线程拥有属于自己的一小部分资源,就是栈空间,保存其运行状态和局部自动变量的。堆是堆,栈是栈。栈可以叫做:堆栈,栈,栈和堆栈指的都是stack,只是叫法不一样。而堆就只能叫做堆。在线程中new出来的空间占的是进程的资源,也就是说是占用的堆资源(heap)。

Demo

  1. from threading import Thread
  2. from multiprocessing import Process
  3. import os,time
  4. def zxc(num):
  5. print('啦啦啦,我是线程%d,我爸是进程%s'%(num,os.getpid()))
  6. time.sleep(1)
  7. def zjc(fid,num):
  8. print('%d我是子进程%d,我爸是主进程%d'%(num,os.getpid(),fid))
  9. for i in range(2):
  10. t = Thread(target=zxc,args=(i,))
  11. t.start()
  12. if __name__ == "__main__":
  13. print('进程%d' % os.getpid())
  14. for i in range(5):
  15. p = Process(target=zjc,args=(os.getpid(),i))
  16. p.start()
  17. p.join()

运行结果

  1. 进程35020
  2. 0我是子进程14384,我爸是主进程35020
  3. 啦啦啦,我是线程0,我爸是进程14384
  4. 啦啦啦,我是线程1,我爸是进程14384
  5. 1我是子进程35404,我爸是主进程35020
  6. 啦啦啦,我是线程0,我爸是进程35404
  7. 啦啦啦,我是线程1,我爸是进程35404
  8. 2我是子进程23772,我爸是主进程35020
  9. 啦啦啦,我是线程0,我爸是进程23772
  10. 啦啦啦,我是线程1,我爸是进程23772
  11. 3我是子进程34384,我爸是主进程35020
  12. 啦啦啦,我是线程0,我爸是进程34384
  13. 啦啦啦,我是线程1,我爸是进程34384
  14. 4我是子进程38128,我爸是主进程35020
  15. 啦啦啦,我是线程0,我爸是进程38128
  16. 啦啦啦,我是线程1,我爸是进程38128

发表评论

表情:
评论列表 (有 0 条评论,391人围观)

还没有评论,来说两句吧...

相关阅读