Параллельность при записи в файл в python - PullRequest
0 голосов
/ 29 апреля 2020

Я сейчас работаю над системой обмена файлами p2p в python3 и столкнулся с проблемой, которую не знаю, как именно исправить.

У меня есть одноранговые узлы с серверным процессом и клиентский процесс, где клиентский процесс подключается к другим узлам, помещает его в свой собственный поток и прослушивает данные через сокет. При загрузке только с одного другого узла файл записывается правильно, без проблем, но если он разделен на несколько узлов, файл поврежден. Данные правильно получены от обоих других пиров, поэтому я думаю, что это будет проблема записи файла.

Когда я получаю данные от пира, я открываю файл, ищу место, куда поступают данные от, а затем запишите его и закройте файл. Решением этой проблемы могут быть блокировки?

Это код в своем собственном потоке, который постоянно прослушивает

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()

1 Ответ

1 голос
/ 29 апреля 2020

Ответил Штеффен Уллрих.

Решение - открыть файл в формате rb + вместо ab +, найти позицию и написать. Обратите внимание, что если файл не существует, он выдаст исключение, так как он не создан в rb +

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...