python - 对文件使用 asyncio 真的是个好主意吗

标签 python concurrency httprequest python-asyncio

我已经阅读和观看了很多有关 python 中的 asyncio 的视频,但有些东西我无法理解。

我知道 asyncio 在处理数据库或 http 请求时非常有用,因为数据库管理系统和 http 服务器可以处理多个快速请求,但是...

它对文件有什么好处,特别是写作......

让我们用在服务器上作为 fastAPI webApp 运行的代码来讨论这个案例。

@app.get('/end_point')
async function ()
    do_something()
    await write_to_a_file
    do_more_stuff_and_return

现在,作为服务器,它可能会收到 50 个、100 个甚至更快的请求来触发此函数,是的 await 将暂停 function() 内的下一条指令/em> ,但是如果有多个请求到来,此函数将启动多次,并一次对文件执行多次写入尝试,这可能会损坏内部数据。

这就是为什么我无法真正理解如何建议对文件使用 asyncio。

我这里有什么问题吗?
有没有办法指示 event_loop 将更高的优先级赋予该 function 事件或其他方法来避免这种情况?

我现在正在做的是延迟写入文件,直到我有X个数据量要写入[突发写入],但我仍然认为任何与文件交互的函数都不应该是异步函数。

但是,我不知道如何处理大量的请求......
我们将非常感谢您的想法,因为我在这方面遇到了困难。

谢谢,祝你有美好的一天。

我正在尝试将数据写入文件,但服务器肯定会收到突发的请求。
所以在某种程度上我不知道如何处理这种情况,而且我担心数据损坏。

最佳答案

I'm trying to write data to file, but the server will surly receive bursts of requests. So in a way I don't know how to handle this situation, and I fear the corruption of data.

是的,损坏可能会时不时发生,特别是如果您使用aiofiles。如果我没记错的话,它使用线程来实现这一点。

我认为你有两个选择:

  1. 使用锁定和后台任务:在 FastApi 中(正如您提到的),您可以在 background 中进行写入(向用户发送响应后),然后获取 lock object用于写入文件。

  2. 对消息进行排队以进行写入:不要直接写入文件,而是将它们放入队列中并让另一个任务/进程完成写入部分。

在这两种情况下,用户都不会等待写入完成并立即得到响应,并且写入部分将同步发生。

关于python - 对文件使用 asyncio 真的是个好主意吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77802627/

相关文章:

http - 如何通过telnet发送POST请求

python - 使用 Python 请求时出现 HTML 501 错误

Python, Pandas - ValueError : Shape of passed values is (1, 5), indices imply (5, 5)

Java - BlockingQueue 卡住多线程应用程序

java - Java可设置过期的全局分布式锁

java - Java中synchronized/volatile的变量可见性影响到什么程度

Java HTTP 请求缓冲区大小

python - numpy.all 与对象数据类型的奇怪行为

Python - 在不使用内置旋转方法的情况下旋转图像

python - 如何在不使用 RDD api 的情况下摆脱 pyspark 数据框中的行包装器对象?