上記のunutbuの回答のデモンストレーションを追加するために、実際にCOW共有メモリであることを示すコードを次に示します(CPython 3.6、Mac OS)
main_shared.py
import multiprocessing
from time import sleep
my_global = None
def test():
global my_global
read_only_secs = 3
while read_only_secs > 0:
sleep(1)
print(f'child proc global: {my_global} at {hex(id(my_global))}')
read_only_secs -= 1
print('child proc writing to copy-on-write...')
my_global = 'something else'
while True:
sleep(1)
print(f'child proc global: {my_global} at {hex(id(my_global))}')
def set_func():
global my_global
my_global = [{'hi': 1, 'bye': 'foo'}]
if __name__ == "__main__":
print(f'main proc global: {my_global} at {hex(id(my_global))}')
set_func()
print(f'main proc global: {my_global} at {hex(id(my_global))}')
p1 = multiprocessing.Process(target=test)
p1.start()
while True:
sleep(1)
print(f'main proc global: {my_global} at {hex(id(my_global))}')
出力
$ python main_shared.py
main proc global: None at 0x101b509f8
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc writing to copy-on-write...
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc global: something else at 0x1022ea3b0
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc global: something else at 0x1022ea3b0
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708
child proc global: something else at 0x1022ea3b0
main proc global: [{'hi': 1, 'bye': 'foo'}] at 0x102341708