【问题标题】:Concurrency when writing to a file in python在 python 中写入文件时的并发性
【发布时间】:2020-08-13 05:43:50
【问题描述】:

我现在正在使用 python3 开发 p2p 文件共享系统,但遇到了一个我不知道如何解决的问题。

我有一个服务器进程和一个客户端进程,其中一个客户端进程连接到其他节点,将其放入自己的线程中,并通过套接字侦听数据。当仅从一个其他对等方下载时,文件可以正确写入,没有问题,但是当它被拆分到多个对等方时,文件已损坏。数据是从其他对等方正确接收的,所以我认为这将是文件写入问题。

当我从对等端获取数据时,我打开文件,寻找数据的来源位置,然后写入并关闭文件。锁能解决这个问题吗?

这是在它自己的线程中不断监听的代码

def handleResponse(clientConnection, fileName, fileSize):
    # Listen for connections forever
    try:
        while True:
            #fileName = ""
            startPos = 0
            data = clientConnection.recv(2154)
            # If a response, process it
            if (len(data) > 0):
                split = data.split(b"\r\n\r\n")
                #print(split[0])
                headers = split[0].replace(b'\r\n', b' ').split(b' ')
                # Go through the split headers and grab the startPos and fileName
                for i in range(len(headers)):
                    if (headers[i] == b"Range:"):
                        startPos = int(headers[i+1])
                        #fileName = headers[i+2].decode()
                        break
                # Write the file at the seek pos
                mode = "ab+"
                if (startPos == 0):
                    mode = "wb+"
                with open ("Download/" + fileName, mode) as f:
                    f.seek(startPos, 0)
                    f.write(split[1])
                    f.close()

【问题讨论】:

  • 为什么要以追加模式打开文件?来自the documentation of open: "... 'a' 用于追加(在某些 Unix 系统上,这意味着 所有写入都追加到文件末尾,而不管当前的查找位置如何)。 ..”.
  • 我不知道(在 MacOS 上)。这是在多个线程乱序写入数据的情况下破坏我的文件的原因吗?如果是这样的话,那将是有道理的。
  • 无论是否并发访问,我实际上都没有理由首先使用 append 打开文件。你应该打开写作(而不是追加),你只是寻找你想要的位置,不管位置是什么。
  • 是的,因为 w 会覆盖文件(如果存在),我将不得不读取文件的初始内容,将数据插入正确的位置,然后写入整个块。如果我走错了方向,请纠正我,但我认为我走在正确的轨道上。谢谢!
  • 其实 r+ 可以做我需要的,我只需要在写入之前创建文件,否则它会失败。感谢您的帮助!

标签: python python-3.x sockets io


【解决方案1】:

由 Steffen Ullrich 回答。

解决办法是用rb+而不是ab+打开文件,找位置写。请注意,如果文件不存在,则会抛出异常,因为它不是在 rb+ 中创建的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2018-05-10
    相关资源
    最近更新 更多