具有共享内存的多进程python

时间:2015-04-17 21:07:41

标签: python multiprocessing

我有一个连接到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"

对于多进程,是否有相同的方法来执行此操作?

谢谢!

2 个答案:

答案 0 :(得分:1)

你确定可以使用以下内容:

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"

然而,重要的是要注意,一旦将对象发送到另一个进程,不同线程中的两个对象selfself就会发散并表示不同的对象。如果您希望进行沟通,则需要在Queue模块中使用包含Pipemultiprocessing的内容。

您可能需要在主线程中保留所有进程(在这种情况下为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_listself.my_dict分别充当共享内存列表和字典。

但是,这两种方法的类型都可能具有限制性,因此您可能需要使用QueueSemaphore来推广自己的技术。但这取决于你正在做什么。

查看multiprocessing文档以获取更多信息。

答案 1 :(得分:1)

直接等效是

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"

但是,这并没有解决“共享内存”方面的问题,它必须与线程处理方式略有不同,在线程中您只能使用全局变量。您还没有真正指定需要在进程之间共享的对象,因此很难确切地说明您应该采用什么方法。但是,multiprocessing文档确实涵盖了ways to deal with shared state。请注意,通常它是better to avoid shared state if possible,并且只是在进程之间显式传递状态,作为Process构造函数的参数或通过Queue之类的东西。