python multiprocessing共享内存怎么执行不一样
数字类型打印会输出
2.11
2.11
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
字符串类型的就只能输出
ggggs
改成字符串类型的时候就变成执行了f里面的print就卡在那里了,等一会马上结束了。没有输出下面的内容,这个是怎么个逻辑呢。请教下各位大侠解释,代码如下:
这是数字类型的代码
from multiprocessing import Process, Value,Arrayimport ctypes
def f(n, a):
n.value=2.11
print(n.value)
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d',1.2)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
字符类型的代码如下:
from multiprocessing import Process, Value,Arrayimport ctypes
def f(n, a):
n.value='ggggs'
print(n.value)
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value(ctypes.c_wchar_p,'ggg')
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
回答:
或者用 Array('u', 'gggg')
, 类似,但是没有raw
属性,也没有value
属性,[:]
切片即是string
-----------update----------------
这得回想下C语言里字符串本质是什么(字符串数组), 所以你只共享个指针当然是有问题的
正确的做法是用 Array 传递 bytes (以下都针对py3)
主进程
python">share_bytes = Array('c', b'gggg')
子进程函数
def f(share_bytes): share_bytes[:] = b'ssss' # 这种方法赋值需要长度一致,也必须是4
#share_bytes.raw = b'sss' # 这种方法长度要 <=4, 第四个字符没有覆盖,依然是'g'
以上是 python multiprocessing共享内存怎么执行不一样 的全部内容, 来源链接: utcz.com/p/937693.html