Skip to content

Instantly share code, notes, and snippets.

@logston
Last active March 26, 2016 17:34
Show Gist options
  • Select an option

  • Save logston/fda5b0e410b82acfec0b to your computer and use it in GitHub Desktop.

Select an option

Save logston/fda5b0e410b82acfec0b to your computer and use it in GitHub Desktop.
Does multiprocessing copy modules or does it share state with the other processes?
"""
Does multiprocessing copy modules or does it share state
with the other processes. I'm almost 100% sure it copies
the state, but why not try an experiment to find out.
"""
import multiprocessing
import sys
def get_sys_module_ids(conn):
ids_by_name = {name: id(mod) for name, mod in sys.modules.items()}
conn.send(ids_by_name)
def main():
return_dicts = []
processes = []
for _ in range(2):
parent_conn, child_conn = multiprocessing.Pipe()
p = multiprocessing.Process(target=get_sys_module_ids, args=(child_conn,))
p.start()
print('Started process', p.pid)
return_dicts.append(parent_conn.recv())
processes.append(p)
for process in processes:
process.join()
dict_1, dict_2 = return_dicts[0], return_dicts[1]
dict_2_keys = set(dict_2.keys())
for key in dict_1:
id_1 = dict_1.get(key)
id_2 = dict_2.get(key)
dict_2_keys.remove(key)
print(key, id_1, id_2, end=' ')
if id_1 != id_2:
print('Unequal')
else:
print('Equal')
for key in dict_2_keys:
id_2 = dict_2.get(key)
print(key, None, id_2, 'Unequal')
main()
Started process 77902
Started process 77903
os 4330959960 4330959960 Equal
_bz2 4334097896 4334097896 Equal
io 4330604408 4330604408 Equal
_frozen_importlib_external 4330321384 4330321384 Equal
_posixsubprocess 4334660488 4334660488 Equal
collections 4332247304 4332247304 Equal
_sre 4331694424 4331694424 Equal
keyword 4332430184 4332430184 Equal
genericpath 4331325704 4331325704 Equal
_imp 4330243800 4330243800 Equal
time 4332195336 4332195336 Equal
reprlib 4332483752 4332483752 Equal
random 4333360536 4333360536 Equal
token 4332686856 4332686856 Equal
_sitebuiltins 4330960040 4330960040 Equal
_collections 4332484232 4332484232 Equal
site 4330905496 4330905496 Equal
_functools 4332589928 4332589928 Equal
shutil 4333309128 4333309128 Equal
_random 4334152824 4334152824 Equal
_heapq 4332432184 4332432184 Equal
__mp_main__ 4330534296 4330534296 Equal
_io 4330321304 4330321304 Equal
_stat 4331324104 4331324104 Equal
linecache 4332248184 4332248184 Equal
_struct 4332938968 4332938968 Equal
_signal 4330603288 4330603288 Equal
posix 4330489880 4330489880 Equal
multiprocessing 4332079208 4332079208 Equal
errno 4330962680 4330962680 Equal
abc 4330604568 4330604568 Equal
sre_compile 4331693144 4331693144 Equal
_lzma 4334098936 4334098936 Equal
itertools 4332431464 4332431464 Equal
selectors 4332999128 4332999128 Equal
os.path 4331324024 4331324024 Equal
enum 4332815208 4332815208 Equal
sre_parse 4331694504 4331694504 Equal
_osx_support 4331621656 4331621656 Equal
tempfile 4332938888 4332938888 Equal
_sysconfigdata 4331618536 4331618536 Equal
re 4331692664 4331692664 Equal
_weakrefset 4330605848 4330605848 Equal
multiprocessing.util 4334216440 4334216440 Equal
sysconfig 4331555400 4331555400 Equal
encodings.aliases 4330631064 4330631064 Equal
multiprocessing.process 4332853912 4332853912 Equal
_pickle 4334621384 4334621384 Equal
struct 4332938808 4332938808 Equal
_compression 4334042232 4334042232 Equal
signal 4332814408 4332814408 Equal
select 4333002008 4333002008 Equal
copy 4333976936 4333976936 Equal
heapq 4332431384 4332431384 Equal
marshal 4330489800 4330489800 Equal
weakref 4332592568 4332592568 Equal
encodings 4330534856 4330534856 Equal
functools 4332332520 4332332520 Equal
math 4333001928 4333001928 Equal
warnings 4333307608 4333307608 Equal
_multiprocessing 4334215800 4334215800 Equal
bz2 4334041432 4334041432 Equal
subprocess 4334624424 4334624424 Equal
atexit 4334624264 4334624264 Equal
_collections_abc 4331325544 4331325544 Equal
pwd 4334039352 4334039352 Equal
multiprocessing.popen_fork 4332882744 4332882744 Equal
__main__ 4330534296 4330534296 Equal
types 4332590728 4332590728 Equal
zipimport 4330534696 4330534696 Equal
codecs 4330535096 4330535096 Equal
_weakref 4330321144 4330321144 Equal
socket 4332938648 4332938648 Equal
stat 4330962760 4330962760 Equal
_codecs 4330630024 4330630024 Equal
lzma 4334042072 4334042072 Equal
tarfile 4333361736 4333361736 Equal
threading 4332137752 4332137752 Equal
fnmatch 4333361416 4333361416 Equal
hashlib 4334152104 4334152104 Equal
grp 4333977496 4333977496 Equal
builtins 4330055144 4330055144 Equal
_operator 4332430344 4332430344 Equal
traceback 4332195656 4332195656 Equal
pickle 4334217400 4334217400 Equal
_socket 4332941128 4332941128 Equal
copyreg 4331693864 4331693864 Equal
_compat_pickle 4334549016 4334549016 Equal
_hashlib 4334153144 4334153144 Equal
collections.abc 4332593048 4332593048 Equal
encodings.utf_8 4330602568 4330602568 Equal
_locale 4330905256 4330905256 Equal
multiprocessing.context 4332079368 4332079368 Equal
posixpath 4331324024 4331324024 Equal
encodings.latin_1 4330603528 4330603528 Equal
tokenize 4332509768 4332509768 Equal
multiprocessing.reduction 4334215960 4334215960 Equal
_thread 4330321064 4330321064 Equal
operator 4332334760 4332334760 Equal
_frozen_importlib 4330245160 4330245160 Equal
sys 4330126856 4330126856 Equal
sre_constants 4331782616 4331782616 Equal
_warnings 4330320264 4330320264 Equal
multiprocessing.connection 4332135912 4332135912 Equal
_bootlocale 4330905096 4330905096 Equal
array 4334550456 4334550456 Equal
@logston
Copy link
Copy Markdown
Author

logston commented Mar 26, 2016

Wow. Why are both processes using the same sys.modules? Is this some sort of copy on write thing? Do they really share state?

@logston
Copy link
Copy Markdown
Author

logston commented Mar 26, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment