外部辞書からアイテムのランダムサンプルリストを生成する単純な関数があります。
def get_random_product_feed_for(mid, n=DEFAULT_AMOUNT_ITEMS_RETURNED):
assert mid is not None, 'Merchant ID cannot be null while retrieving products feed'
n = min(n, MAX_FEED_ITEMS_RETURNED)
if mid in ADVERTISERS_PRODUCT_FEEDS: # check if merchant is present in the outer dict
feeds = ADVERTISERS_PRODUCT_FEEDS[mid] # retrieve merchant's items
# Sample list
if len(feeds) >= n:
random_feeds = random.sample(feeds, n)
else:
random_feeds = feeds
return random_feeds
return []
どこADVERTISERS_PRODUCT_FEEDS = defaultdict(list)
。
ただし、この関数をREST Framework API呼び出しで使用すると、半分の時間で空のリストが返されます。他のすべての呼び出し。しかし、問題はビューやシリアライザーにあるとは思いません。
それにもかかわらず、セットアップはこれよりも少し複雑です。ADVERTISERS_PRODUCT_FEEDS
ダウンロードが必要な大きなファイルから処理されるため、非同期でフェッチされます。
threads = [] # to keep only one active thread for the process
def fetch_products_feed():
for thr in threads:
if not thr.is_alive():
threads.remove(thr)
if len(threads) > 0:
logging.warning(
'Attempted to create multiple threads for product feeds fetching process. '
'Wait until it is done!'
)
return
thread = threading.Thread(target=fetch_products_feed_sync, name='Fetch-Products-Thread')
threads.append(thread)
thread.start()
これまでのところ、私はそれfetch_products_feed_sync
がその仕事を適切に行っていると推測することしかできません(質問を過度に複雑にしないため)。アイテムを読み取り、に追加するだけADVERTISERS_PRODUCT_FEEDS
です。
このセットアップ全体は実際にはローカルで機能しますが、私はサーバーをAWSでホストしています。したがって、問題はそこにのみ現れます。ローカルでは、呼び出しごとに結果が得られます。
私は、スレッドがすべてを台無しにすることを提案することしかできません。私は正しいですか?メインスレッドはそれを読み取るだけでADVERTISERS_PRODUCT_FEEDS
変更しないので、問題ないはずだと思いました。
たぶん、すべての呼び出しで、アプリケーションはスレッドか何かを変更します。したがって、最初ADVERTISERS_PRODUCT_FEEDS
は値が含まれてADVERTISERS_PRODUCT_FEEDS
いますが、アプリケーションが別のスレッドにあるため、次のステップ(呼び出し)には値がありませんか?
誰もがAWSで物事をデバッグするのに苦労していることを考慮して、それをデバッグするように私にどのようにアドバイスしますか?
たとえば、mid
渡されたものが間違っていると、空のリストが返されますが、問題はないようです(デバッグして、後で更新します)。
更新:
問題は、他ADVERTISERS_PRODUCT_FEEDS
のget_random_product_feed_for
すべての呼び出しの範囲内で空であることにあることが発見されました。内部でアクティブなスレッドの名前をデバッグしようとしましたget_random_product_feed_for
。成功した(アイテムがある)呼び出しADVERTISERS_PRODUCT_FEEDS
と失敗した(ADVERTISERS_PRODUCT_FEEDS
アイテムがない)呼び出しの両方がMainThreadから来ているようです。では、なぜMainThreadはある時点でデータにアクセスできるのか、次の瞬間(関数呼び出し)ではアクセスできないのか、その後すぐに再びアクセスできるのかなどです。
この問題は、AWSがWSGI用に作成する複数のプロセスにあるようです。
NumProcesses
AWSの設定を微調整すると、それに応じて失敗する結果の割合が増えることを発見しました。したがって、私が持っている場合NumProcesses=3
、アプリケーションは空のセット2/3を返します。これは、3つのプロセスのうち1つだけが必要なデータをフェッチしたことを意味します。
私の知る限り、プロセス間でメモリを共有するソリューションはありません。実行できる唯一の解決策は、データを永続化することです(データベースなど)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加