小编use*_*768的帖子

回调函数如何在python多处理map_async中工作

我花了整整一夜调试我的代码,最后我发现了这个棘手的问题.请看下面的代码.

from multiprocessing import Pool

def myfunc(x):
    return [i for i in range(x)]

pool=Pool()

A=[]
r = pool.map_async(myfunc, (1,2), callback=A.extend)
r.wait()
Run Code Online (Sandbox Code Playgroud)

我以为我会得到A=[0,0,1],但输出是A=[[0],[0,1]].这对我来说没有意义,因为如果我有A=[],A.extend([0])A.extend([0,1])会给我A=[0,0,1].可能回调的工作方式不同.所以我的问题是如何A=[0,0,1]取而代之[[0],[0,1]]?提前感谢您的任何意见.

python pool multiprocessing

19
推荐指数
1
解决办法
3万
查看次数

有没有一种有效的方法在python中的多处理中共享只读稀疏矩阵

我发现很多类似的问题,但没有答案.对于简单数组,有多处理.Array.对于稀疏矩阵或任何其他任意对象,我找到manager.namespace.所以我尝试了下面的代码:

from scipy import sparse
from multiprocessing import Pool
import multiprocessing
import functools

def myfunc(x,ns):
    return ns.A[x,:]*ns.A*ns.A[:,x]

manager = multiprocessing.Manager()
Global = manager.Namespace()
pool=Pool()
Global.A=sparse.rand(10000,10000,0.5,'csr')
myfunc2=functools.partial(myfunc,ns=Global)
r=pool.map(myfunc2, range(100))
Run Code Online (Sandbox Code Playgroud)

代码有效,但效率不高.16名工人中只有4名工作.原因是,我猜,经理只允许一个工人一次访问数据.由于数据是只读的,我真的不需要锁.那么有更有效的方法吗?

ps,我见过有人在谈论copy-on-write fork().我真的不明白它是什么,但它不起作用.如果我先生成A并执行Pool(),则每个进程都会有一个A的副本.

先感谢您.

python multiprocessing

8
推荐指数
1
解决办法
714
查看次数

Julia 中使用的函数参数中的美元符号前缀是什么?

当我在 Julia 中搜索“$”前缀时,我能找到的只是它用于字符串或表达式插值。例如,这里https://docs.julialang.org/en/v1/base/punctuation/。但是,我见过人们的代码,例如

add_broadcast!($y_d, $x_d)
Run Code Online (Sandbox Code Playgroud)

在本教程https://cuda.juliagpu.org/stable/tutorials/introduction/ 中。这里的“$”符号不能插值,可以吗?函数文档中没有关于这种用法的任何内容https://docs.julialang.org/en/v1/manual/functions/。所以我很困惑。任何想法表示赞赏。谢谢!

dollar-sign julia

5
推荐指数
1
解决办法
145
查看次数

如何在python中并行化big for循环

我刚接触Python,但仍处于学习曲线的艰难阶段。感谢您的任何评论。

我有一个很大的for循环要运行(在许多迭代中都很大),例如:

for i in range(10000)
    for j in range(10000)
        f((i,j))
Run Code Online (Sandbox Code Playgroud)

我虽然认为这将是一个如何并行化的常见问题,但在Google上搜索了数小时后,我使用“ multiprocessing”模块找到了解决方案,如下所示:

pool=Pool()
x=pool.map(f,[(i,j) for i in range(10000) for j in range(10000)])
Run Code Online (Sandbox Code Playgroud)

当循环较小时,此方法有效。但是,如果循环很大,那确实很慢;或者如果循环太大,有时会发生内存错误。看来python会首先生成参数列表,然后甚至使用xrange将列表提供给函数“ f”。那是对的吗?

所以这种并行化对我来说不起作用,因为我真的不需要将所有参数都存储在列表中。有一个更好的方法吗?我感谢任何建议或参考。谢谢。

python parallel-processing list multiprocessing

3
推荐指数
1
解决办法
1736
查看次数