os.fork除了继承父进程的所有内容,并且都在内存为这些内容进行了重新的地址分配,类似于python中的deep copy
先聊下copy,deepcopy内容
import os import copy from copy import deepcopy a=100 b='12123' c=[1,2,3,4] print(id(a),id(b),id(c)) acp=a bcp=b ccp=c print(id(acp),id(bcp),id(ccp))
运行结果
(python38) [root@mysql04 crawler]# python testfork.py 9736032 139855151961008 139855151961280 9736032 139855151961008 139855151961280
可以看出来Python分配的内存地址都是一样的
代码如果这样改写
import os import copy from copy import deepcopy a=100 b='12123' c=[1,2,3,4] d=100 print(id(a),id(b),id(c),id(d)) acp=a bcp=b ccp=c print(id(acp),id(bcp),id(ccp)) acp=deepcopy(a) bcp=deepcopy(b) ccp=c print(id(acp),id(bcp),id(ccp)) acp=200 bcp='12123' ccp[1]=2000 print(id(acp),id(bcp),id(ccp)) acp=400 bcp='155sdfd' ccp[1]=50200 print(id(acp),id(bcp),id(ccp),ccp,c) acp=8520 bcp='155ddasdfd' ccp=deepcopy(c) ccp[1]=50000 print(id(acp),id(bcp),id(ccp),ccp,ccp)
运行结果
(python38) [root@mysql04 crawler]# python testfork.py 9736032 140681963512816 140681963513088 9736032 9736032 140681963512816 140681963513088 9736032 140681963512816 140681963513088 9739232 140681963512816 140681963513088 140681963906960 140681836478384 140681963513088 [1, 50200, 3, 4] [1, 50200, 3, 4] 140681963907152 140681836478320 140681963377920 [1, 50000, 3, 4] [1, 50000, 3, 4]
可以看出字符,整形float类数据赋值都是如果值一样的话,那么是同一个地址,一旦值变了,内存地址也会改变,类似身份证和持有人的关系一样,无论这个人是整容还是毁容那么这个人的身份证号码都是那个号码。用了普通的拷贝和深拷贝内存地址都是一样的
列表属于引用类型,普通的浅拷贝,只是另外一个变量的地址只想原有数据的地址,deepcopy会重新分配内存地址,数据指向新的内容地址,这时候操作列表和原有列表是两种操作,互不干扰
有了上面的基础下面介绍os.fork
import os,time
a=100
b='12123'
c=[1,2,3,4]
print('主-1',id(a),id(b),id(c))
p=os.fork()
if p==0:
a=200
b='2323'
c[1]=100
time.sleep(10)
print('子',id(a), id(b), id(c),a,b,c)
print('主-2',id(a),id(b),id(c),a,b,c)
运行结果
import os,time
a=100
b='12123'
c=[1,2,3,4]
print('主-1',id(a),id(b),id(c))
p=os.fork()
if p==0:
a=200
b='2323'
c[1]=100
time.sleep(10)
print('子',id(a), id(b), id(c),a,b,c)
print('主-2',id(a),id(b),id(c),a,b,c)
所有变量的内存地址都已修改,无论是string,int,float还是列表
os.fork下面的内容主进程和子进程都继续



