- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个关于 python Multiprocessing.pool 的快速问题。这是我的代码:
import multiprocessing as mp
info =999
def func(x):
global info
print info
return x**3
pool = mp.Pool()
for i in range(2):
print "Iteration: ", i
results = pool.map(func, range(1,10))
print "Value of info", info
info += 1
print results
print "Iteration", i, "End"
print
输出看起来像这样:
999
999
999
999
999
999
999
999
999
999
999
999
999
999
999
999
999
999
Iteration: 0
Value of info 999
[1, 8, 27, 64, 125, 216, 343, 512, 729]
Iteration 0 End
Iteration: 1
Value of info 1000
[1, 8, 27, 64, 125, 216, 343, 512, 729]
Iteration 1 End
我想知道为什么在第二次迭代中再次打印 999 而不是 1000。如何更新全局变量信息以便在第二次迭代中打印 1000?非常感谢!
最佳答案
评论已经说明了一点。我想我会解释得更多一些。
当使用 multiprocessing
模块时,它将根据 pool
中请求的进程数创建新进程。默认值由 multiprocessing.cpu_count()
计算。
假设您编写的脚本是 A.py
,它创建了进程 A
。当A
创建新进程时,它们被称为A
的子进程。这些子进程将具有相同的全局变量,并以 A
开头。
但是,每个子进程都有自己的作用域,因此更改一个子进程中的变量 info
不会影响其他子进程中 info
的值。而且它肯定不会影响父进程 A
中的值。
一个简单的解决方案是指示每个子进程向父进程A
报告所需的info
更改。也就是说,map
中的每个子进程都应返回 -1
作为结果,而父进程 A
会在其自己的范围内聚合更新。在分布式计算中,这称为参数服务器设计。
在理想世界中,您真正想要的是共享范围和内存的线程。但是 Python
线程会因为 Global Interpreter Lock
而变得非常复杂。如果您有兴趣,可以对此进行一些 Google 搜索。
我误读了您的代码。在我的脑海里,凌晨 2 点,我阅读了子项中 info
的修改和父项中的打印。事实上恰恰相反。
你是正确的,关键是修改不会跨进程共享。如果您使用 global
访问子进程中的 info
,子进程将不会意识到更改,因为该函数在创建时被 pickled
模块的时间。您可以在 http://grahamstratton.org/straightornamental/entries/multiprocessing 继续阅读
您需要将动态 info
作为函数的参数发送给它,如下所示:
import multiprocessing as mp
def dual_input(t):
info, x = t
print info
return x**3
def main():
info =999
pool = mp.Pool(2)
for i in range(2):
print "Iteration: ", i
results = pool.map(dual_input, zip([info]*9, range(1,10)))
print "Value of info", info
info += 1
print results
print "Iteration", i, "End"
print
if __name__ == '__main__': main()
上面的代码打印:
Iteration: 0
999
999
999
999
999
999
999
999
999
Value of info 999
[1, 8, 27, 64, 125, 216, 343, 512, 729]
Iteration 0 End
Iteration: 1
1000
1000
1000
1000
1000
1000
1000
1000
1000
Value of info 1000
[1, 8, 27, 64, 125, 216, 343, 512, 729]
Iteration 1 End
关于python - 在循环中使用 multiprocessing.pool 并更新目标函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47402616/
我正在使用 boost.pool,但我不知道何时使用 boost::pool<>::malloc和 boost::pool<>::ordered_malloc ? 所以, boost::pool<>:
我目前正在尝试从 anaconda 中的 spy 控制台运行并行代码。我相信问题可能出在我的计算机不允许 anaconda 控制 CPU 核心上,但我不知道如何解决这个问题。 另一个有趣的点是,当我运
在了解 Python 的 multiprocessing 包(对于 Python 3.4 )时,我注意到 multiprocessing.Pool 是在类 BaseContext 中定义的 上下文.p
我有这样的程序: from multiprocessing import Pool import time def f(x): # I make a heavy code here to take t
我有一个模块 A,它通过获取数据并将其发送到模块 B、C、D 等进行分析,然后将它们的结果结合在一起来执行基本的 map/reduce。 但是模块 B、C、D 等似乎不能自己创建多处理池,否则我得到
所以我有一个脚本可以连接到大约 700 个设备并执行一系列命令,然后退出。我开始使用 Multiprocessing.Pool 和 Pool.map 来减少脚本的运行时间,并允许我同时登录多个设备。
在下面的链接中有对 Pool 类的 map 方法的解释。 它似乎阻塞直到结果准备好。这意味着不需要执行 pool.close(); pool.join() 在运行 pool.map 之后,但是它在 t
context 是 class multiprocessing.pool.Pool 构造函数中的可选参数。 Documentation只说: context can be used to specif
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What's the difference between sending -release or -dra
不确定这是否是正确的论坛。 libvirt 页面链接在这里。如果这需要张贴在不同的地方请告诉我。 virsh pool-define-as 和 create-as 有什么区别?阅读 virsh 的手册
谁能告诉我Spring Cloud Feign Client是否提供或支持Http连接池,如果可以,那么如何配置诸如池大小的设置?我似乎在官方文档中找不到此内容。谢谢你。 最佳答案 通过调查,我将尝试
我在尝试运行 Flask 应用程序时遇到了一些困难。我收到以下导入错误: File "/db/mysql_utils.py", line 2, in import mysql.conne
我有一个 Node 项目,在其中使用 pg-pool 库。我已在我的依赖项中包含以下内容: "@types/pg-pool": "0.0.3", "pg": "^7.3.0", "pg-format"
在 python 2 中,multiprocessing.dummy.Pool 和 multiprocessing.pool.ThreadPool 之间有什么区别吗?源代码似乎暗示它们是相同的。 最佳
这个问题在这里已经有了答案: Concurrent.futures vs Multiprocessing in Python 3 (6 个答案) 关闭 5 年前。 请给我解释一下这两个类有什么区别?
multiprocessing 的文档states以下关于Pool.join() : Wait for the worker processes to exit. One must call clos
我找到了一些资源,但我不确定我是否理解。 我找到的一些资源是: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb2ff3358411d1829f00
我的 Javafx 应用程序抛出许多非法状态异常,我尚未能够在源中跟踪触发器。 任何人都可以指导我导致此问题的原因以及我应该在哪里查找原因。我很难在这里展示一些代码,因为我不知道是什么原因造成的。 任
参见下面的示例和执行结果: #!/usr/bin/env python3.4 from multiprocessing import Pool import time import os def in
我目前有一个连接到我的主数据库的开放池,它运行良好。但是现在,我想为另一个数据库打开一个新池。我完全按照设置第一个池的方式设置了新池,显然我编辑了数据库名称等。加载 setupHikari() 方法时
我是一名优秀的程序员,十分优秀!