gpt4 book ai didi

python - Django(REST Framework)每隔一次调用都会返回空列表

转载 作者:太空宇宙 更新时间:2023-11-03 20:07:28 24 4
gpt4 key购买 nike

我有一个简单的函数,可以从外部字典中生成项目的随机样本列表。

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 调用中使用此函数时,它有一半的时间返回空列表;每隔一个电话。然而,我认为问题不在于 View 或序列化器。

不过,设置比这稍微复杂一些。 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 在某个时刻可以访问数据,而在下一个时刻(函数调用)却不能,再过一会儿又可以访问数据,等等?

最佳答案

问题似乎出在 AWS 为 WSGI 创建的多个进程中。

我发现,如果您在 AWS 的配置中调整 NumProcesses,那么失败结果的比率会相应增加。因此,如果我有 NumProcesses=3,那么应用程序将返回空集 2/3。这意味着三个进程中只有一个已获取所需数据。

据我了解,没有解决方案可以在进程之间共享内存。唯一可以做的解决方案是保留数据(例如,在数据库中)。

关于python - Django(REST Framework)每隔一次调用都会返回空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58899845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com