2017-02-22 7 views
1

現在、私の体格はFlask, Redis, RabbitMQ and Celeryです。私の掻き取りでは、requestsBeautifulSoupを使用しています。 私のフラスコはapacheとwsgiで動作しています。これは刺激的です。 app.run(threaded=True)セロリを使用した掻爬ウェブサイト

私は25のAPIを持っています。 10はヘッダーなどのようにURLを掻き集めるもので、残りはそのURLにサードパーティのAPIを使用するものです。

requestsを使用してAPIを処理し、APIからデータを取得するためにコードを使用しています。

私のコードのヘッダーには、私のコールバックには1しかありませんが、私は3人しかいません。 ConnectTimeoutErrorMaxRetryErrorというボトルネックの問題があります。私はいくつかのスレッドを読んでいるので、このエラーが発生すると、リモートサーバーが過負荷になっているため、すべてのプロセスでタイムアウトが発生したと言われています。

問題は私がコードを使用しているからです.25 API呼び出しが同時に実行されるため、時間スリープを使用する意味がありません。誰かがこれに遭遇しましたか?または私はこれを間違っているのですか?

私が読んでいるスレッドは、リクエストをpycurlに変更したり、Scrapyを使用しているようです。しかし、ConnectTimeoutErrorは私のホストが特定のURLサーバーを過負荷にしていることが原因だとは思わない。

私の和音プロセス:api_request仕事の依頼で

callback = create_document.s(url, company_logo, api_list) 
header = [api_request.s(key) for key in api_list.keys()] 
result = chord(header)(callback) 

が使用されています。

答えて

0

実行中のスクラップの数を同時に制限する場合は、実行したいタスクと同じプロパティを共有する別のタスクが実行されているかどうかを確認するエンキュータスクを作成できます。タスクが実行されている場合は、数秒間スリープ状態にして再度確認します。実行中でないことがわかると、実行したいタスクをキューに入れることができます。これにより、非同期タスクで眠ることができます。特定の番号だけが実行されている場合は、タスクをカウントしてさらに実行することもできます。これを使用すると、一度に5を実行し、それが十分に絞られる場合は、1が終了した見たときに、別のキューに見ることができるなど

:: EDIT ::

Documentation for Celery Inspect

+0

あなたがリンクにはありますかドキュメンテーションまたはサンプルコード? – Bazinga

+0

参考リンクを追加しました。 –

関連する問題