簡體   English   中英

共享內存的多進程python

[英]Multiprocesses python with shared memory

我有一個連接到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"

但是,重要的是要注意,將對象發送到另一個進程后,兩個對象的selfself在不同線程中會發散並代表不同的對象。 如果您希望進行通信,則需要使用multiprocessing模塊中包含的“ Queue或“ Pipe類的東西。

您可能需要在主線程中保留所有進程的引用(在本例中為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來展示自己的技術。 但這取決於您在做什么。

查看多處理文檔以獲取更多信息。

直接等效為

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文檔確實涵蓋了處理共享狀態的方法 請注意,通常最好避免共享狀態 ,而最好在進程之間顯式傳遞狀態,既可以作為Process構造函數的參數,也可以通過Queue類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM