Django(REST Framework)は、1回おきに空のリストを返します

ローマのシロコフ

外部辞書からアイテムのランダムサンプルリストを生成する単純な関数があります。

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_FEEDSget_random_product_feed_forすべての呼び出しの範囲内で空であることにあることが発見されました内部でアクティブなスレッドの名前をデバッグしようとしましたget_random_product_feed_for成功した(アイテムがある)呼び出しADVERTISERS_PRODUCT_FEEDSと失敗した(ADVERTISERS_PRODUCT_FEEDSアイテムがない)呼び出しの両方がMainThreadから来ているようです。では、なぜMainThreadはある時点でデータにアクセスできるのか、次の瞬間(関数呼び出し)ではアクセスできないのか、その後すぐに再びアクセスできるのかなどです。

ローマのシロコフ

この問題は、AWSがWSGI用に作成する複数のプロセスにあるようです。

NumProcessesAWSの設定を微調整すると、それに応じて失敗する結果の割合が増えることを発見しましたしたがって、私が持っている場合NumProcesses=3、アプリケーションは空のセット2/3を返します。これは、3つのプロセスのうち1つだけが必要なデータをフェッチしたことを意味します。

私の知る限り、プロセス間でメモリを共有するソリューションはありません。実行できる唯一の解決策は、データを永続化することです(データベースなど)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

GetでIDのリストを返します。Django Rest Framework

分類Dev

Django Rest FrameworkのPUTリクエストは500を返しますが、データを更新します

分類Dev

Django Rest Framework ImageField

分類Dev

Python Django Rest Framework UnorderedObjectListWarning

分類Dev

Django Rest Framework Cache Headers

分類Dev

Django Rest Framework部分更新

分類Dev

Django Rest FrameworkとJSONField

分類Dev

Logout Django Rest Framework JWT

分類Dev

Django REST framework filtering views

分類Dev

Django REST framework and form validation

分類Dev

Django REST Framework Swagger 2.0

分類Dev

Django Rest Framework + Angular 2

分類Dev

Django Rest Framework JWT Auth

分類Dev

Django/Django Rest Framework - Disable CSRF

分類Dev

Django Rest Framework Serializerは、実際の値ではなくUItextfieldを返します

分類Dev

Django Rest Framework:DestroyApiViewを使用して削除しようとしたときにサーバーリクエストを4回呼び出す

分類Dev

Django REST FrameworkUserSerializerのkeyerror

分類Dev

Django Rest Frameworkは、複数のクエリセットを1つのAPIエンドポイントに結合します

分類Dev

Django Rest Framework:IDのリストをシリアル化する

分類Dev

テストのreverse()は、django-rest-frameworkのテストで相対URLのみを返すため、404が発生します

分類Dev

Django REST Framework:nullを空の文字列に置き換える方法は?

分類Dev

Django REST FrameworkValidationErrorは常に400を返します

分類Dev

django-rest-framework-simplejwtは更新を無効にします

分類Dev

Django Rest Frameworkでテストし、このcurlリクエストを再現しますか?

分類Dev

Ajaxを介したdjango-rest-frameworkログインはHTMLを返します

分類Dev

Django Rest Framework:ネストされた構造から値の一意のリストを取得します

分類Dev

Django Rest Framework:ネストされた構造から値の一意のリストを取得します

分類Dev

Django Rest Frameworkのシリアル化された画像は、Amazon s3のURLではなく、絶対的なシステムURLを返します

分類Dev

Django Rest Framework:ModelViewSetを使用してPKごとにインスタンスのリストを取得する

Related 関連記事

  1. 1

    GetでIDのリストを返します。Django Rest Framework

  2. 2

    Django Rest FrameworkのPUTリクエストは500を返しますが、データを更新します

  3. 3

    Django Rest Framework ImageField

  4. 4

    Python Django Rest Framework UnorderedObjectListWarning

  5. 5

    Django Rest Framework Cache Headers

  6. 6

    Django Rest Framework部分更新

  7. 7

    Django Rest FrameworkとJSONField

  8. 8

    Logout Django Rest Framework JWT

  9. 9

    Django REST framework filtering views

  10. 10

    Django REST framework and form validation

  11. 11

    Django REST Framework Swagger 2.0

  12. 12

    Django Rest Framework + Angular 2

  13. 13

    Django Rest Framework JWT Auth

  14. 14

    Django/Django Rest Framework - Disable CSRF

  15. 15

    Django Rest Framework Serializerは、実際の値ではなくUItextfieldを返します

  16. 16

    Django Rest Framework:DestroyApiViewを使用して削除しようとしたときにサーバーリクエストを4回呼び出す

  17. 17

    Django REST FrameworkUserSerializerのkeyerror

  18. 18

    Django Rest Frameworkは、複数のクエリセットを1つのAPIエンドポイントに結合します

  19. 19

    Django Rest Framework:IDのリストをシリアル化する

  20. 20

    テストのreverse()は、django-rest-frameworkのテストで相対URLのみを返すため、404が発生します

  21. 21

    Django REST Framework:nullを空の文字列に置き換える方法は?

  22. 22

    Django REST FrameworkValidationErrorは常に400を返します

  23. 23

    django-rest-framework-simplejwtは更新を無効にします

  24. 24

    Django Rest Frameworkでテストし、このcurlリクエストを再現しますか?

  25. 25

    Ajaxを介したdjango-rest-frameworkログインはHTMLを返します

  26. 26

    Django Rest Framework:ネストされた構造から値の一意のリストを取得します

  27. 27

    Django Rest Framework:ネストされた構造から値の一意のリストを取得します

  28. 28

    Django Rest Frameworkのシリアル化された画像は、Amazon s3のURLではなく、絶対的なシステムURLを返します

  29. 29

    Django Rest Framework:ModelViewSetを使用してPKごとにインスタンスのリストを取得する

ホットタグ

アーカイブ