python os.fork模块复制父进程所有内存数据并分配新地址

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值