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下面的内容主进程和子进程都继续