我想知道是否有可能在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。
你知道我怎么能做到这一点吗?