3

私の問題は、appengine で必要な非同期 URL フェッチの応答でメモリを最適に解放する方法です。これが私が基本的にpythonで行うことです:

rpcs = []

for event in event_list:
    url = 'http://someurl.com'
    rpc = urlfetch.create_rpc()
    rpc.callback = create_callback(rpc)
    urlfetch.make_fetch_call(rpc, url)
    rpcs.append(rpc)

for rpc in rpcs:
    rpc.wait()

私のテストシナリオでは、1500 リクエストに対してそれを行います。しかし、短時間でさらに多くを処理できるアーキテクチャが必要です。

次に、タスクをキューに追加して結果を処理するコールバック関数があります。

def event_callback(rpc):
    result = rpc.get_result()
    data = json.loads(result.content)
    taskqueue.add(queue_name='name', url='url', params={'data': data})

私の問題は、非常に多くの同時 RPC 呼び出しを行っているため、インスタンスのメモリがクラッシュすることです

私はすでに3つのことを試しました:

del result
del data

result = None
data = None

コールバック関数の後にガベージ コレクターを手動で実行しました。

gc.collect()

しかし、コールバック関数がタスクをキューに追加した直後にメモリを解放するものは何もないように見えるため、インスタンスがクラッシュします。それを行う他の方法はありますか?

4

2 に答える 2

2

間違ったアプローチ: これらの URL を (put)-queue に入れ、そのレートを目的の値 (デフォルト: 5/秒) まで上げて、各タスクに 1 つの URL フェッチ (またはそのグループ) を処理させます。1 分あたり 3000 回の url-fetch-api-calls という安全上の制限があることに注意してください (1 回の url-fetch で複数の api-call が使用される場合があります)。

于 2013-01-29T13:22:59.377 に答える
1

urlfetch にもタスク キューを使用し、ファン アウトしてメモリの枯渇を回避し、名前付きタスクを登録し、event_list カーソルを次のタスクに提供します。このようなシナリオでは、プロセスごとに新しいタスクを登録するのではなく、特にプロセスにデータストアの書き込みも含まれる場合に、フェッチ + プロセスを使用することをお勧めします。

また、これらの非同期ソリューションをよりエレガントにするために ndb を見つけました。

スケーラブルなアプリとおそらくパイプラインに関する Brett Slatkins の講演をご覧ください。

于 2013-01-29T13:23:34.267 に答える