如何解决修改.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 举报,一经查实,本站将立刻删除。