- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
import multiprocessing
import numpy as np
import multiprocessing as mp
import ctypes
class Test():
def __init__(self):
shared_array_base = multiprocessing.Array(ctypes.c_double, 100, lock=False)
self.a = shared_array = np.ctypeslib.as_array(shared_array_base)
def my_fun(self,i):
self.a[i] = 1
if __name__ == "__main__":
num_cores = multiprocessing.cpu_count()
t = Test()
def my_fun_wrapper(i):
t.my_fun(i)
with mp.Pool(num_cores) as p:
p.map(my_fun_wrapper, np.arange(100))
print(t.a)
在上面的代码中,我尝试使用 multiprocessing
编写代码来修改数组。在每个进程中执行的函数 my_fun()
应该修改数组 a[:]
的值在作为参数传递给 my_fun()
的索引 i
处。关于上面的代码,我想知道正在复制什么。
1) 每个进程是否复制了代码中的任何内容?我认为该对象可能是,但理想情况下什么都不是。
2) 有没有办法绕过对对象使用包装函数 my_fun()
?
最佳答案
您的代码中的几乎所有内容都会被复制,除了您使用 multiprocessing.Array
分配的共享内存。 multiprocessing
充满了不直观的隐式副本。
当您在 multiprocessing
中生成一个新进程时,新进程需要它自己的原始进程中几乎所有内容的版本。这取决于平台和设置的不同处理方式,但我们可以告诉您正在使用“fork”模式,因为您的代码不会在“spawn”或“forkserver”模式下工作 - 您会收到有关 workers not 的错误能够找到 my_fun_wrapper
。 (Windows 仅支持“spawn”,因此我们可以判断您不在 Windows 上。)
在“fork”模式下,这个初始副本是通过使用 fork
系统调用要求操作系统复制整个进程和里面的所有内容来完成的。 multiprocessing.Array
分配的内存有点“外部”,不会被复制,但大多数其他东西都是。 (也有写时复制优化,但写时复制仍然表现得好像一切都被复制了,并且由于引用计数更新,优化在 Python 中效果不佳。)
当您将任务分派(dispatch)给工作进程时,multiprocessing
需要制作更多副本。任何参数,以及任务本身的可调用对象,都是主进程中的对象,对象本质上只存在于一个进程中。 worker 无法访问任何这些。他们需要自己的版本。 multiprocessing
通过 pickle 可调用对象和参数、通过进程间通信发送序列化字节以及在 worker 中取消 pickle 来处理第二轮副本。
当 master pickle my_fun_wrapper
时,pickle 只是说“在 __main__
模块中寻找 my_fun_wrapper
函数”,而 worker 们则看升级他们的 my_fun_wrapper
版本来解开它。 my_fun_wrapper
寻找一个全局的 t
,在 workers 中,那个 t
是由 fork 产生的,而 fork 产生了一个 t
包含一个由您在原始 multiprocessing.Array
调用中分配的共享内存支持的数组。
另一方面,如果您尝试将 t.my_fun
传递给 p.map
,则 multiprocessing
必须 pickle 和 unpickle a方法对象。生成的 pickle 不会说“查找 t
全局变量并获取其 my_fun
方法”。泡菜说要构建一个新 Test
实例并获取its my_fun
方法。 pickle 中没有任何关于使用您分配的共享内存的说明,生成的 Test
实例及其数组独立于您要修改的原始数组。
我知道没有什么好方法可以避免需要某种包装函数。
关于python - 多处理是否在这种情况下复制对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58869012/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!