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