具有共享内存的多进程python
我有一个连接到websocket远程服务器的对象。我需要同时进行并行处理。但是,我不想创建到服务器的新连接。因为线程是更容易做到这一点的方法,这就是我到目前为止一直在使用的方法。然而,由于GIL,我得到了巨大的延迟。我可以通过并行多进程实现与线程相同的功能吗 这是我的代码:具有共享内存的多进程python,python,multiprocessing,Python,Multiprocessing,我有一个连接到websocket远程服务器的对象。我需要同时进行并行处理。但是,我不想创建到服务器的新连接。因为线程是更容易做到这一点的方法,这就是我到目前为止一直在使用的方法。然而,由于GIL,我得到了巨大的延迟。我可以通过并行多进程实现与线程相同的功能吗 这是我的代码: class WebSocketApp(object): def on_open(self): # Create another thread to make sure the commands are alw
class WebSocketApp(object):
def on_open(self):
# Create another thread to make sure the commands are always been read
print "Creating thread..."
try:
thread.start_new_thread( self.read_commands,() )
except:
print "Error: Unable to start thread"
对于多进程,有没有一种等效的方法可以做到这一点
谢谢 您当然可以使用以下内容:
from multiprocessing import Process
class WebSocketApp(object):
def on_open(self):
# Create another thread to make sure the commands are always been read
print "Creating thread..."
try:
p = Process(target = WebSocketApp.read_commands, args = (self, )) # Add other arguments to this tuple
p.start()
except:
print "Error: Unable to start thread"
但是,需要注意的是,一旦对象被发送到另一个进程,不同线程中的两个对象self
和self
就会发散并代表不同的对象。如果您希望通信,则需要使用多处理
模块中包含的队列
或管道
您可能需要在主线程中保留所有进程的引用(p
),以便能够告知您的程序正在终止(因为仍在运行的子进程在死亡时会挂起父进程),但这取决于程序的性质
如果希望保持对象不变,可以执行以下操作之一:
将所有对象属性设置为单值或数组,然后执行类似操作:
from multiprocessing import Process, Value, Array
class WebSocketApp(object):
def __init__(self):
self.my_value = Value('d', 0.3)
self.my_array = Array('i', [4 10 4])
# -- Snip --
然后这些值应该作为共享内存使用。但是类型非常严格(必须指定它们的类型)
另一个答案是使用管理器:
from multiprocessing import Process, Manager
class WebSocketApp(object):
def __init__(self):
self.my_manager = Manager()
self.my_list = self.my_manager.list()
self.my_dict = self.my_manager.dict()
# -- Snip --
然后self.my_list
和self.my_dict
分别充当共享内存列表和字典
但是,这两种方法的类型都有限制,因此您可能必须使用队列
和信号量
来使用自己的技术。但这取决于你在做什么
有关更多信息,请参阅文档。直接等效项为
import multiprocessing
class WebSocketApp(object):
def on_open(self):
# Create another process to make sure the commands are always been read
print "Creating process..."
try:
multiprocessing.Process(target=self.read_commands,).start()
except:
print "Error: Unable to start process"
然而,这并没有解决“共享内存”方面的问题,它的处理方式必须与线程略有不同,在线程中,您可以只使用全局变量。您还没有真正指定需要在进程之间共享哪些对象,所以很难说您应该采取什么方法。然而,
多处理
文档确实涵盖了这一点。请注意,通常情况下,它是,并且只是在进程之间显式地传递状态,或者作为进程的参数
构造函数,或者通过类似于a的东西。您尝试了吗?是的,但我正在试图弄清楚如何拥有共享内存。我需要self对象是同一个实例,而不是不同的实例。实际上,您不需要保留对进程的引用,也不需要在其上调用join
,主进程就可以终止。只要子进程自己退出,您的主进程也可以退出。调用p.join()。在退出之前,主程序将对任何非守护子程序隐式调用join
。进程中的两个不同对象“self”是我试图避免的。因为我需要它是对象的同一个实例。实现这一点的最佳方法是什么?@LuisCruz更新了更多共享内存信息。我需要共享的对象基本上是self对象。如果我使用多进程,那么传递的self对象将是该对象的另一个实例,这就是我试图避免的。