我正在Python中进行多处理实验,并试图在两个进程之间共享一个字符串数组。这是我的python代码:
from multiprocessing import Process, Array, Value
import ctypes
def f1(a, v):
for i, l in enumerate(['a', 'b', 'c']):
a[i] = l*3
v.value += 1
print "f1 : ", a[:], v.value
def f2(a,v):
v.value += 1
print "f2 : ", a[:], v.value
if __name__ == '__main__':
val = Value(ctypes.c_int, 0)
arr = Array(ctypes.c_char_p, 3)
print "Before :", arr[:], val.value
p = Process(target=f1, args=(arr, val))
p2 = Process(target=f2, args=(arr, val))
p.start()
p2.start()
p.join()
p2.join()
print "After : ", arr[:], val.value
运行脚本时,我看到该脚本arr
已正确填充,并且可在中找到,f1()
但不能在中找到f2()
。结果如下:
% python /tmp/tests.py
Before : [None, None, None] 0
f1 : ['aaa', 'bbb', 'ccc'] 1
f2 : ['\x01', '\x11', '\x01'] 2
After : ['\x01', '\x01', '\x01'] 2
我忽略了什么吗?
预先感谢您的反馈。:)
我的猜测是:
arr
存储3个指针。f1()
将它们分配给当前进程之外没有意义的内存地址。f2()
尝试访问此时包含垃圾邮件的无意义地址。
分配对所有过程都有意义的值似乎有帮助:
from __future__ import print_function
import ctypes
import time
from multiprocessing import Process, Array, Value
values = [(s*4).encode('ascii') for s in 'abc']
def f1(a, v):
for i, s in enumerate(values):
a[i] = s
v.value += 1
print("f1 : ", a[:], v.value)
def f2(a,v):
v.value += 1
print("f2 : ", a[:], v.value)
def main():
val = Value(ctypes.c_int, 0)
arr = Array(ctypes.c_char_p, 3)
print("Before :", arr[:], val.value)
p = Process(target=f1, args=(arr, val))
p2 = Process(target=f2, args=(arr, val))
p.start()
p2.start()
p.join()
p2.join()
print("After : ", arr[:], val.value)
if __name__ == '__main__':
main()
Before : [None, None, None] 0
f1 : ['aaaa', 'bbbb', 'cccc'] 1
f2 : ['aaaa', 'bbbb', 'cccc'] 2
After : ['aaaa', 'bbbb', 'cccc'] 2
问题内容: 我在多处理模块上遇到了麻烦。我正在使用具有其map方法的工作人员池从大量文件中加载数据,对于每个文件,我都使用自定义函数来分析数据。每次处理文件时,我都希望更新一个计数器,以便可以跟踪还有多少文件需要处理。这是示例代码: 我找不到解决方案。 问题答案: 问题在于该变量未在您的进程之间共享:每个单独的进程都在创建它自己的本地实例并对其进行递增。 有关可用于在进程之间共享状态的某些技术,请
问题内容: 我想在共享内存中使用一个numpy数组,以便与多处理模块一起使用。困难是像numpy数组一样使用它,而不仅仅是ctypes数组。 这将产生如下输出: 可以ctypes方式访问该数组,例如arr[i]说得通。但是,它不是一个numpy数组,因此我无法执行,或。我想一个解决方案是将数组转换为数组。但是(除了无法完成这项工作外),我不相信会再共享它。 对于必须解决的常见问题,似乎将有一个标准
问题内容: 第一个问题是Value和Manager()。Value有什么区别? 其次,是否可以不使用Value共享整数变量?下面是我的示例代码。我想要的是获取一个整数值而不是Value的字典。我所做的就是在此过程之后全部更改。有没有更简单的方法? 问题答案: 使用时,您会在共享内存中获得一个对象,默认情况下,该对象使用进行同步。使用该对象时,您将得到一个控制服务器进程的对象,该服务器进程允许对象值
问题内容: 我有三个大名单。前一个包含位数组(模块位数组0.8.0),另外两个包含整数数组。 这些数据结构占用相当多的RAM(总计约16GB)。 如果我使用以下方法启动12个子流程: 这是否意味着将为每个子流程复制l1,l2和l3,或者子流程将共享这些列表?或者更直接地说,我将使用16GB还是192GB的RAM? someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算。结果
问题内容: 我有一个类似大型的对象,需要在多个工作进程之间共享。每个工作人员读取对象中信息的随机子集,并对其进行一些计算。我想避免复制大对象,因为我的机器很快耗尽了内存。 我正在处理此SO问题的代码,并对其进行了一些修改以使用固定大小的进程池,该池更适合于我的用例。然而,这似乎打破了它。 输出是 如您所见,在第一种情况下,所有工作进程都获得相同的对象(按ID)。在第二种情况下,id不相同。这是否意
我正在尝试在namecheap服务器上安装一些软件包到我的共享托管帐户,我是一个完全的node Js乞丐,所以如果这是一个愚蠢的问题,请与我一起,我最初尝试安装两个软件包<code>express 输出如下 它说它找不到文件包.json或无法读取/解析此文件。所以我创建了一个空白文件,看看它是否会写入数据或用必要的信息填充它,现在当我在任何模块上运行npm时,它不再发出警告,只是抛出一个错误...