Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multiprocessing 存储在多处理中的值与原始值不同_Multiprocessing_Ctypes - Fatal编程技术网

Multiprocessing 存储在多处理中的值与原始值不同

Multiprocessing 存储在多处理中的值与原始值不同,multiprocessing,ctypes,Multiprocessing,Ctypes,我试图在多处理类值中存储一个bytes对象,但我发现实际存储的值与我想要存储的值不同。例如,以下代码的计算结果为False import ctypes import dill import multiprocessing as mp x = [{str(i):i} for i in range(10)] y = dill.dumps(x) serialized_workbook = mp.Value(ctypes.c_char_p, dill.dumps(None)) serialized_

我试图在多处理类值中存储一个bytes对象,但我发现实际存储的值与我想要存储的值不同。例如,以下代码的计算结果为False

import ctypes
import dill
import multiprocessing as mp
x = [{str(i):i} for i in range(10)]

y = dill.dumps(x)

serialized_workbook = mp.Value(ctypes.c_char_p, dill.dumps(None))
serialized_workbook.value = y
serialized_workbook.value ==  y
为什么会发生这种情况?我如何防止这种情况发生?我想这样做的原因是为了以后可以再次加载它

dill.loads(serialized_workbook.value)
上面的代码失败,而下面的代码则没有

dill.loads(y)

c\u char\u p
value
是以null结尾的字符串,因此它在
dumps(x)
字符串中的第一个null处停止。另外,由于
c\u char\p
是一个指针,因此在跨平台多处理上下文中,它通常是无用的。Windows没有
fork
来共享父进程的地址空间,因此与另一个进程共享指针是毫无意义的(在
多处理
框架内)。您可以将类型与
c\u char
c\u ubyte
一起使用。谢谢!这很有帮助。我现在对这个问题有了更多的了解,但我一直在修改序列化的worbook的内容,这个变量需要跨不同的进程访问,这让我觉得我应该使用mp.Manager来获得一个共享列表。我并不反对这一点。对此有何评论?通过
Value
Array
使用
mmap
支持的共享内存的好处是不必在进程之间进行pickle和管道数据处理。否则,跨进程共享状态是一个性能瓶颈。通常,最好尽可能保持工作进程无状态。通过
管道
队列
向工作人员传递消息。流程
是一种简单的管理方法。工作项通常应该是CPU绑定的。对于I/O绑定的工作,通常最好使用线程,或者使用带有协程的异步I/O框架。在适当的地方使用协程/线程和进程。如果需要通过多处理来访问多个内核以解决CPU受限的问题,请仔细设计系统以避免在进程之间共享状态。若您绝对必须共享状态,而共享内存不是一个选项,那个么托管容器是合适的。这就是它的目的。但它在同步和数据复制方面付出了实实在在的代价。