簡體   English   中英

Python多重處理-兩個進程之間的函數式通信

[英]Python multiprocessing - function-like communication between two processes

我遇到以下問題:

我有兩個不同的班級。 我們稱它們為interfaceworker 該接口應該接受來自外部的請求,並將其多路復用到多個工作程序。

與我發現的幾乎每個示例相反,我有幾個特點:

  • 不應為每個請求都重新創建工人。
  • 工人不同。 workers[0]的請求不能由workers[1]回答。 這種復用是在interface完成的。
  • 我有許多類似函數的調用,這些調用很難通過事件或簡單的隊列進行建模。
  • 有幾個不同的請求,這會使每個請求一個隊列很困難。

例如,假設每個工作人員都存儲一個整數(假設該工作人員收到的電話數量)。 在非並行處理中,我將使用以下內容:

class interface(object):
    workers = None #set somewhere else.

    def get_worker_calls(self, worker_id):
        return self.workers[worker_id].get_calls()

class worker(object)
    calls = 0

    def get_calls(self):
        self.calls += 1
        return self.calls

顯然,這是行不通的。 什么事

或者,也許更相關的是,我沒有多處理經驗。 我是否缺少可以輕松解決上述問題的設計范例?

謝謝!

作為參考,我考慮了幾種方法,但找不到合適的方法:

  • 使用一個請求和應答隊列。 我已經放棄了這個想法,因為那樣會在當前工作人員的回答時間內阻塞interface (使其擴展性很差),或者會要求我發送額外的信息。
  • 使用一個請求隊列。 每個消息都包含一個管道,用於返回該請求的答案。 解決了無法通過管道發送管道問題之后,我遇到了管道關閉的問題,除非通過連接發送兩端。
  • 使用一個請求隊列。 每個消息都包含一個隊列,用於返回該請求的答案。 失敗,因為我無法通過隊列發送隊列,但是減少竅門不起作用。
  • 上面的內容也適用於相應的Manager生成的對象。

多處理意味着您要運行2個以上的獨立進程。 沒有辦法直接將內存從一個進程訪問到另一個進程(如使用多線程)。

最好的選擇是使用某種外部Queue機制,您可以從CeleryRQ開始。 RQ比較簡單,但是芹菜具有內置的監視功能。

但是,您必須知道,只有在Celery / RQ能夠“打包”所需的函數/類並將其發送到其他進程的情況下,多處理才能工作。 因此,您必須使用__main__級別的函數(位於文件頂部,不屬於任何類)。

您總是可以自己實現它,Redis非常簡單,ZeroMQ和RabbitMQ也很好。

Beaver庫是一個很好的例子,說明了如何使用ZeroMQ隊列在python中處理多重處理。

暫無
暫無

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

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