相关疑难解决方法(0)

访问类的多处理代理的属性

我有一个类,我想以只读的方式与池中的子进程共享,所以我准备了一个类的代理,但它没有用.以下是我的问题的简化示例.

from multiprocessing.managers import BaseManager

class TestClass:
    def __init__(self, a):
        self.a = a
    def b(self):
        print self.a

class MyManager(BaseManager): pass

MyManager.register('test', TestClass)

if __name__ == '__main__':
    manager = MyManager()
    manager.start()
    t = TestClass(1)
    print t.a
    mt = manager.test(2)
    mt.b()
    mt.a
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,我得到:

1
2
Traceback (most recent call last):
  File "multiprocess_example_stackexchange.py", line 20, in <module>
    mt.a 
AttributeError: 'AutoProxy[test]' object has no attribute 'a'
Run Code Online (Sandbox Code Playgroud)

似乎我无法通过代理直接访问共享对象的属性.是使用获取属性的方法的唯一方法,还是我做错了什么?

python multiprocessing

13
推荐指数
2
解决办法
4743
查看次数

为什么在简单用例中子类化多处理的 BaseManager?

我的问题是关于multiprocessing.Managers.BaseManager的正确用法。文档中的主要示例展示了如何通过创建 BaseManager 的子类来自定义此类。我可以理解是否有人这样做是为了修改或扩展 BaseManager 的行为。

但在网上,甚至在 Stackoverflow 上的一个答案中,人们通过创建一个根本不改变 BaseManager 行为的子类来演示 BaseManager 的用法:

class MyManager(BaseManager): pass
Run Code Online (Sandbox Code Playgroud)

我的问题是:在这种情况下这样做有什么意义?为什么不直接使用 BaseManager 和 BaseManager.register() 呢?我错过了什么吗?

编辑:我发现了更多的例子:这里这里

python multiprocessing python-2.7

6
推荐指数
1
解决办法
1517
查看次数

如何与子进程共享父进程的numpy随机状态?

我在程序开始时设置了numpy随机种子.在程序执行期间,我使用多次运行函数multiprocessing.Process.该函数使用numpy随机函数绘制随机数.问题是Process获取当前环境的副本.因此,每个进程都独立运行,它们都以与父环境相同的随机种子开始.

所以我的问题是如何在子环境中与父进程环境共享numpy的随机状态?请注意,我想Process用于我的工作,需要使用一个单独的类,并分别import numpy在该类中执行.我尝试使用multiprocessing.Manager共享随机状态,但似乎事情没有按预期工作,我总是得到相同的结果.此外,如果我将for循环移动到内部drawNumpySamples或将其留在其中并不重要main.py; 我仍然无法得到不同的数字,随机状态总是一样的.这是我的代码的简化版本:

# randomClass.py
import numpy as np
class myClass(self):
    def __init__(self, randomSt):
        print ('setup the object')
        np.random.set_state(randomSt)
    def drawNumpySamples(self, idx)
        np.random.uniform()
Run Code Online (Sandbox Code Playgroud)

并在主文件中:

    # main.py
    import numpy as np
    from multiprocessing import Process, Manager
    from randomClass import myClass

    np.random.seed(1) # set random seed
    mng = Manager()
    randomState = mng.list(np.random.get_state())
    myC = myClass(randomSt = randomState)

    for i in range(10):
        myC.drawNumpySamples() # this will …
Run Code Online (Sandbox Code Playgroud)

python numpy multiprocessing scipy python-3.x

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

标签 统计

multiprocessing ×3

python ×3

numpy ×1

python-2.7 ×1

python-3.x ×1

scipy ×1