4

辞書(リクエストと呼ばれる)を含むリスト(requestRosterと呼ばれる)があります。「requests」ディクショナリの項目は、「requestTime」や「thisURL」などです。例えば:

[
{'thisURL': 'http://localhost/bikes', 'requestTime': datetime.datetime(2012, 10, 18, 0, 41, 34)}, 
{'thisURL': 'http://localhost/clothing', 'requestTime': datetime.datetime(2012, 10, 18, 0, 41, 35)}
]

multiprocessing.Process を使用して新しいプロセスを生成し、各リクエストを発行しています。

各プロセスで requestRoster を更新し、各リクエストに「応答」項目を追加したいと思います。

これどうやってするの?

multiprocessing.Manager() を使用して manager.list() と manager.Namespace() を作成しようとしました。どちらも私がやりたいことをすることはできません

multiprocessing.Lock() を使用できると思います

  • ミューテックスを取得する
  • プロセス内で requestRoster のコピーを作成する
  • ローカライズされた requestRoster を変更する
  • 「グローバル化された」リクエスト名簿をローカライズされたもので上書きする
  • ミューテックスを解放する

...しかし、少し手の込んだようで、もっと単純なものが欠けているのではないかと思います。非同期コールバックは素晴らしいでしょう。

4

3 に答える 3

2

可能であれば、共有メモリ構造は避けたほうがよいでしょう。ここでは、プロセスに dict 自体のリストへの書き込みを行わせる必要はありません。代わりに、メイン プロセスにこれを任せ、URL フェッチだけをプロセスに任せることができます。

こういうの好きconcurrent.futures.<Process|Thread>PoolExecutorです。

于 2012-10-23T15:19:49.720 に答える
0

マルチプロセッシングの代わりにスレッドを使用してこれを行うことができました。ワーカーはディスパッチャーと同じプロセス内にあるため、requestRosterを更新できます。

于 2012-10-23T21:36:36.570 に答える
0

このアプローチはあなたのために働くべきだと思います:

発車係:

create logger_queue
create logger process, initialize with logger_queue
for each request
    create worker_pipe
    create worker process, initialize with send end of worker_pipe
    push receive end of worker_pipe over logger_queue

ワーカー:

make request
push response over connection

ロガー:

while True
    for connection on logger_queue
        create new element in logging list
        link connection to new logging list element
    for each open connection
        poll for message
        if message
            store message to log
            close connection

ロガー プロセスは、任意の出力ルーチンを実行することもできるため、別のプロセスがログに記録されたデータセットから読み取ることを心配する必要さえありません。上記の接続は を参照していることに注意してくださいmultiprocessing.Connection

于 2012-10-23T16:28:35.483 に答える