具有共享内存的多进程python

具有共享内存的多进程python,python,multiprocessing,Python,Multiprocessing,我有一个连接到websocket远程服务器的对象。我需要同时进行并行处理。但是,我不想创建到服务器的新连接。因为线程是更容易做到这一点的方法,这就是我到目前为止一直在使用的方法。然而,由于GIL,我得到了巨大的延迟。我可以通过并行多进程实现与线程相同的功能吗 这是我的代码: class WebSocketApp(object): def on_open(self): # Create another thread to make sure the commands are alw

我有一个连接到websocket远程服务器的对象。我需要同时进行并行处理。但是,我不想创建到服务器的新连接。因为线程是更容易做到这一点的方法,这就是我到目前为止一直在使用的方法。然而,由于GIL,我得到了巨大的延迟。我可以通过并行多进程实现与线程相同的功能吗

这是我的代码:

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对象将是该对象的另一个实例,这就是我试图避免的。