在Python

时间:2017-11-16 08:29:54

标签: python numpy multiprocessing

我想知道是否有可能在Python中的multiprocessing.Process之间共享我的类的对象?我发现很少有想法,但似乎他们不想为我的类型工作。

这是我的导入

import multiprocessing as mp
import sharedmem as shm
import random

我想分享我班级的流程对象,让我们说它是MyVector类

class MyVector:
    def __init__(self,x_1,x_2):
        self.x_1 = x_1
        self.x_2 = x_2

    def set_vector(self, x_1, x_2):
        self.x_1 = x_1
        self.x_2 = x_2

    def get_vector(self):
        return self.x_1, self.x_2

现在它看起来很简单。下一步是创建适当大小和dtype

的sharedmem数组
v_size = 5
shared = shm.empty(v_size, dtype=MyVector)
print("shared", shared)

我的输出是

shared [None None None None None]

对我来说现在看起来很奇怪,因为当我将类型改为浮动时,打印会给我下面的结果

shared [ 0.  0.  0.  0.  0.]

让我们走得更远。现在我想将MyVectors添加到共享和打印对象

min_x = 0
max_x = 1
for _ in range(v_size):
    x_1 = random.uniform(min_x, max_x)
    x_2 = random.uniform(min_x, max_x)
    shared[_] = MyVector(x_1, x_2)
for i in range(v_size):
    print(shared[i].get_vector())

示例结果如

(0.09967776182991428, 0.5409857393838231)
(0.6722157278118476, 0.7321068889697359)
(0.8677334456416979, 0.009142982318455117)
(0.6627846159441471, 0.1627625183127126)
(0.08099900459563925, 0.5904205522643091)

所以看起来一般都好。让我们关注流程。我想创建v_size进程,将共享传递给some_function()并检查结果

processes = [mp.Process(target=some_function, args=(shared, i, 0, 0)) for i in range(v_size)]
print(processes)
for process in processes:
    process.start()
for process in processes:
    process.join()

def some_function(shared, idx, x_1, x_2):
    print(shared[idx])
    shared[idx] = MyVector(x_1, x_2)
    print(shared[idx])

我的想法是将MyVector的每个对象更改为(0,0),但似乎在idx位置的some_function()对象中为None。当我试图在some_function()中创建MyVector并更改idx位置时,它只在some_function()内部工作,所以我开始的每个进程似乎都会创建它的副本(或者一些None对象的副本( ??))

奇怪的是,我看不到vsize进程,只有1。

你知道我怎么能做到这一点吗?

0 个答案:

没有答案