修改.txt文件的异步功能导致程序挂起/冻结

问题描述

这是我函数的简化版本,在发送一些Web请求并进行了一些检查之后,便会修改某个.txt文件,该文件的名称包含在变量filename_partners中:

async def add_partner(session,user_id):
    user_premium_request = await session.get(SOME_REQUEST)
    
    if (await user_premium_request.content.read())[-145:-141] == b"true":
    
        with open(filename_partners,"r+") as partners_library:
            file = partners_library.read()
    
        if (str(user_id) + ":") in file:
            pass
        else:
            user_item_id_list = []
            user_item_request = await session.get(SOME_REQUEST)
            user_items_list = json.loads(await user_item_request.text())["data"]

            for item in user_items_list:
                user_item_id_list.append(item["assetId"])
            if len(user_item_id_list) >= 1:
                with open(filename_partners,"a+") as partners_library:
                    partners_library.write("\n" + str(user_id) + ":" + str(time.time()))
    else:
        with open(filename_partners,"r+") as partners_library:
            file = partners_library.read()

            if (str(user_id) + ":") in file:
                lines = file.splitlines()
                cursor_token = lines[0]

                with open(filename_partners_temp,"a+") as partners_library_temp:
                    partners_library_temp.write(cursor_token)
                    for line in lines[1:]:
                        if (str(user_id) + ":") in line:
                            partners_library_temp.write(
                                "\n"
                                + str(user_id)
                                + ":"
                                + str(time.time() + 2592000)
                            )

                        else:
                            partners_library_temp.write("\n" + line)
    
                    partners_library_temp.seek(0)
                    new_file = partners_library_temp.read()
    
                    with open(filename_partners,"w+") as partners_library_2:
                        partners_library_2.write(new_file)
    
                os.remove(filename_partners_temp)

问题是,对于我的程序,我必须多次调用此函数1000次,这可能需要很长时间。为了对抗它,我决定同时调用它:

# seller_ids is a list of 200-300 items
for user_id in seller_ids:
    tasks.append(add_partner(session,user_id))
await asyncio.gather(*tasks)

但是,这样做会使我的程序在运行2-20分钟后冻结/挂起。没有错误被触发,我可以肯定是导致错误的原因是我同时调用了许多.txt修改函数。为了检验我的理论,我尝试连续地称呼他们:

for user_id in seller_ids_clear:
    await add_partner(session,user_id)

以这种方式运行程序后,它不再冻结/挂起,但是运行速度慢了大约10倍,这对我来说是个问题。

我确定这归咎于文件操作,但是我不确定同时调用该异步函数100次会导致我的程序死机而没有显示错误。如果这里有人在文件操作和异步方面有更多经验,请告诉我您的建议和理论!

更新:似乎整个程序都没有冻结,但是只有add_partner()函数冻结/挂起,导致程序的很大一部分无限期地等待它等待结束,而程序的其他部分却未与add_partner()连接的任何部分,都继续正常运行。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)