Issue 32291: Value error for string shared memory in multiprocessing (original) (raw)
It seems like sharing a string over processes is not possible.
#!/usr/bin/env python3
import multiprocessing
import threading
import ctypes
def fun(share_c, share_s, set_c, set_s, name):
print(f'{name}: {share_c.value}; {share_s.value}')
share_c.value = set_c
share_s.value = set_s
print(f'{name}: {share_c.value}; {share_s.value}')
if __name__ == '__main__':
share_c = multiprocessing.Value(ctypes.c_wchar, 'a')
share_s = multiprocessing.Value(ctypes.c_wchar_p, 'aa')
print(f'pre_thread: {share_c.value}; {share_s.value}')
thread = threading.Thread(target=fun, args=(share_c, share_s, 'b', 'bb', 'thread'))
thread.start()
thread.join()
print(f'post_thread: {share_c.value}; {share_s.value}')
process = multiprocessing.Process(target=fun, args=(share_c, share_s, 'c', 'cc', 'process'))
process.start()
process.join()
print(f'post_process: {share_c.value}', end='; ')
print(share_s.value) # <--- Blows here
produces:
pre_thread: a; aa
thread: a; aa
thread: b; bb
post_thread: b; bb
process: b; bb
process: c; cc
post_process: c; Traceback (most recent call last):
File "test2.py", line 30, in <module>
print(share_s.value) # <--- Blows here
File "<string>", line 5, in getvalue
ValueError: character U+ff92f210 is not in range [U+0000; U+10ffff]
Where the character value in the error message is different every time. To me this seems like a bug as it is working properly with threads as well as single characters. (Maybe relevant question also here: https://stackoverflow.com/questions/47763878/how-to-share-string-between-processes?noredirect=1#comment82492062_47763878)
For the case it matters: Python 3.6.1 (Anaconda 4.4.0) on RHEL 6
This problem seems to be support for str.
import multiprocessing import ctypes
def child_process_fun(share): share.value = 'bb'
if name == 'main': share = multiprocessing.Value(ctypes.c_wchar_p, 'aa') process = multiprocessing.Process(target=child_process_fun, args=(share, )) process.start() process.join() print(share.value)
It also raises ValueError.When use c_double or c_int, it works well.
Test in python3.7 and 3.8