我花了整整一整天的时间,结束了我的学识:
我想改变在子进程共享multiprocessing.Value字符串,但蟒挂起只要子过程试图改变共享值。
下面的示例代码:
from multiprocessing import Process, Value, freeze_support
from ctypes import c_wchar_p
def test(x):
with x.get_lock():
x.value = 'THE TEST WORKED'
return
if __name__ == "__main__":
freeze_support()
value = Value(c_wchar_p, '')
p = Process(target=test, args = (value,))
p.start()
print(p.pid)
# this try block is to also allow p.run()
try:
p.join()
p.terminate()
except:
pass
print(value.value)
我尝试过但不起作用的内容:
c_wchar_p
和c_char_p
类型的ctype,但是都导致相同的冻结。x.get_lock()
freeze_support()
什么工作(但没有帮助):
value = Value('d',0)
和x.value = 1
)。p.start()
替换为p.run()
)我正在使用Windows 10 64位和Python 3.6.4(Spyder,但也在Spyder之外尝试过)。
欢迎您的帮助!
答案 0 :(得分:1)
共享指针在另一个进程中将不起作用,因为该指针仅在创建它的进程中有效。而是使用数组:
import multiprocessing as mp
def test(x):
x.value = b'Test worked!'
if __name__ == "__main__":
x = mp.Array('c',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.value)
输出:
b'Test worked!'
请注意,阵列型'c'
是专业并返回一个SynchronizedString
与其它类型的返回SynchronizedArray
。下面是如何使用类型'u'
,例如:
import multiprocessing as mp
from ctypes import *
def test(x):
x.get_obj().value = 'Test worked!'
if __name__ == "__main__":
x = mp.Array('u',15)
p = mp.Process(target=test, args = (x,))
p.start()
p.join()
print(x.get_obj().value)
输出:
Test worked!
请注意,应该使用+=
上下文管理器来保护对包裹值的非原子操作(例如with x.get_lock():
)进行读/修改/写操作。