Python 在多处理中跨所有进程共享类的最简单方法

Python 在多处理中跨所有进程共享类的最简单方法,python,class,multiprocessing,Python,Class,Multiprocessing,我有一个在初始化时启动多个线程的类。最初我使用的是线程,但我从中学到了它会变得多么缓慢。当我对此进行研究时,似乎多处理会更快,因为它实际上使用了多个核。唯一困难的是它不会自动共享值。如何在所有进程中共享以下代码 理想情况下,它还可以在类外的进程之间共享。 而且,如果可能的话,我宁愿分享整个类,也不愿分享每个单独的值 将多处理导入为mp 从时间上导入睡眠 类别ThreadedClass: 定义初始化(自): self.var=0 #这里是我想告诉多处理共享“self”的地方 change\u va

我有一个在初始化时启动多个线程的类。最初我使用的是线程,但我从中学到了它会变得多么缓慢。当我对此进行研究时,似乎多处理会更快,因为它实际上使用了多个核。唯一困难的是它不会自动共享值。如何在所有进程中共享以下代码

理想情况下,它还可以在类外的进程之间共享。 而且,如果可能的话,我宁愿分享整个类,也不愿分享每个单独的值

将多处理导入为mp
从时间上导入睡眠
类别ThreadedClass:
定义初始化(自):
self.var=0
#这里是我想告诉多处理共享“self”的地方
change\u var=mp.Process(target=self.change\u var,args=())
print_var=mp.Process(target=self.print_var,args=())
更改变量start()
睡眠(0.5)
打印变量开始()
def更改变量(自身):
尽管如此:
self.var+=1
打印(“将变量更改为”,self.var)
睡眠(1)
def打印变量(自身):
尽管如此:
打印(“打印变量:”,self.var)
睡眠(1)
ThreadedClass()
我还将上述代码的输出包括在下面:

Changed var to  1  
Printing var:  0  
Changed var to  2  
Printing var:  0 
Changed var to  3  
Printing var:  0  
Changed var to  4  
Printing var:  0 
Changed var to  5  
Printing var:  0  
Changed var to  6  
Printing var:  0 
Changed var to  7  
Printing var:  0  
Changed var to  8  
Printing var:  0 
Changed var to  9  
Printing var:  0  
Changed var to  10

提前感谢。

首先,多处理意味着您正在创建子进程。这意味着,一般来说,他们在记忆中有自己的空间,彼此不说话。需要明确的是,当您启动一个新的多处理线程时,python会将所有全局变量复制到该线程中,然后将该线程与其他线程分开运行。因此,当您生成两个进程时,change_var和print_var,每个进程都收到一份self,因为它们是self的两份副本,所以它们都没有相互交谈。一个线程正在更新它自己的self副本并生成正在计数的答案,另一个线程没有更新self。您可以自己轻松地进行测试:

import multiprocessing as mp
LIST = [] # This list is in parent process. 
def update(item):
    LIST.append(item)
p = mp.Process(target=update, args=(5,)) # Copies LIST, update, and anything else that is global. 
p.start()
p.join()
# The LIST in the sub-process is cleaned up in memory when the process ends. 
print(LIST) # The LIST in the parent process is not updated. 
如果不同的过程在试图处理变量时,正在更新彼此的变量,这将是非常危险的;因此,为了自然地隔离它们(并防止“分段错误”),将复制整个名称空间。如果希望子进程彼此通信,则需要与为此而设计的管理器和队列通信

我个人建议您围绕Pool()之类的东西编写代码。非常干净,输入一个数组,返回一个数组,完成。但是如果你想进入兔子洞,下面是我在多处理网站上读到的内容

import multiprocessing as mp

def f(queue):
    queue.put(['stuff',15])
def g(queue):
    queue.put(['other thing'])

queue = mp.Queue()
p = mp.Process(target=f,args=(queue,))
q = mp.Process(target=g,args=(queue,))
p.start()
q.start()
for _ in range(2):
    print(queue.get())
p.join()
q.join()
其主要思想是队列不会被复制,而是允许将内容留在队列中。当您运行queue.get()时,它会等待队列中其他进程留下的内容被获取。get()阻塞并等待。这意味着您可以让一个进程读取另一个进程的内容,如:

import multiprocessing as mp

def f(queue):
    obj = queue.get() # Blocks this sub-process until something shows up. 
    if obj:
        print('Something was in the queue from some other process.')
        print(obj)
def g(queue):
    queue.put(['leaving information here in queue'])

queue = mp.Queue()
p = mp.Process(target=f,args=(queue,)) 
q = mp.Process(target=g,args=(queue,))
p.start()
这有点酷,所以我建议在这里等待一秒钟,思考等待处理的内容。接下来开始q过程

q.start()
请注意,p直到q开始才完成处理。这是因为队列被阻塞并等待出现某些内容

# clean up 
p.join()
q.join()

您可以在以下位置阅读更多内容:

我相信您必须在队列()中进行写操作。工人们不经过经理就不能真正交谈。@BobbyOcean我如何使用队列()?