我有一个连接到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"
对于多进程,是否有相同的方法来执行此操作?
谢谢!
答案 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"
然而,重要的是要注意,一旦将对象发送到另一个进程,不同线程中的两个对象self
和self
就会发散并表示不同的对象。如果您希望进行沟通,则需要在Queue
模块中使用包含Pipe
或multiprocessing
的内容。
您可能需要在主线程中保留所有进程(在这种情况下为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
分别充当共享内存列表和字典。
但是,这两种方法的类型都可能具有限制性,因此您可能需要使用Queue
和Semaphore
来推广自己的技术。但这取决于你正在做什么。
查看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
之类的东西。