程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python os.fork模塊復制父進程所有內存數據並分配新地址

編輯:Python

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) [[email protected] 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) [[email protected] 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下面的內容主進程和子進程都繼續


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved