2

マルチプロセッシングキューを使用するPythonでプログラムを作成する方法を理解しようとしています。

複数のサーバーがあり、そのうちの1つがこれをリモートでキューに提供します:

from multiprocessing.managers import BaseManager
import Queue
import daemonme

queue = Queue.Queue()

class QueueManager(BaseManager):
    pass

daemonme.createDaemon()
QueueManager.register('get_job', callable=lambda:queue)
m = QueueManager(address=('', 50000), authkey='')
s = m.get_server()
s.serve_forever()

ここで、デュアル Xeon、クアッド コア サーバーを使用して、このリモート キューからジョブを処理したいと考えています。ジョブは互いに完全に独立しています。したがって、8 つのコアがある場合、キューからジョブを選択して処理し、次のジョブに戻る 7 つのプロセスを開始したいと考えています。7 つのプロセスのそれぞれがこれを行いますが、このプログラムの構造について頭を悩ませることはできません。

これの基本的な構造について、知識のあるアイデアを教えてくれる人はいますか?

前もって感謝します。

4

2 に答える 2

2

キューをそれぞれに渡す 7 つのジョブを起動するワーカーのプール(17.6.2.9 項) を使用するよりも、マネージャからキューを取得する方法 (17.6.2.7 項) のドキュメントを参照してください。

別の方法として、生産者/消費者の問題のようなものを考えることができます:

from multiprocessing.managers import BaseManager
import random

class Producer():
def __init__(self):
    BaseManager.register('queue')
    self.m = BaseManager(address=('hostname', 50000), authkey='jgsjgfdjs')
    self.m.connect()
    self.cm_queue = self.m.queue()
    while 1:
        time.sleep(random.randint(1,3))
        self.cm_queue.put(<PUT-HERE-JOBS>)

from multiprocessing.managers import BaseManager
import time
import random
class Consumer():
def __init__(self):
    BaseManager.register('queue')

    self.m = BaseManager(address=('host', 50000), authkey='jgsjgfdjs')
    self.m.connect()
    self.queue = self.m.queue()
    while 1:
        <EXECUTE(job = self.queue.get())>


from multiprocessing.managers import BaseManager, Queue
class Manager():

def __init__(self):

    self.queue = QueueQueu()

    BaseManager.register('st_queue', callable=lambda:self.queue)

    self.m = BaseManager(address=('host', 50000), authkey='jgsjgfdjs')
    self.s = self.m.get_server()

    self.s.serve_forever()
于 2009-08-24T15:55:54.980 に答える
0

マスター/スレーブ (別名、農夫/労働者) パターンを使用する必要があります。最初のプロセスはマスターであり、ジョブを作成します。これ

  1. キューを作成します
  2. 7 つのスレーブ プロセスを作成し、キューをパラメータとして渡します
  3. キューへのジョブの書き込みを開始します

スレーブ プロセスは、キューから継続的に読み取り、ジョブを実行します (おそらく、キューから停止メッセージを受信するまで)。このシナリオでは、マネージャー オブジェクトを使用する必要はありません。

于 2009-08-24T15:53:11.753 に答える