У меня есть несколько файлов, отображаемых в память (как mmap
объектов). В процессе их обработки каждый файл должен быть открыт несколько раз. Он работает нормально, если есть только один поток. Однако, когда я пытаюсь запустить задачу параллельно, возникает проблема: разные потоки не могут одновременно обращаться к одному и тому же файлу. Проблема иллюстрируется этим образцом:Множественный доступ к объектам mmap в python
import mmap, threading
class MmapReading(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
for i in range(10000):
content = mmap_object.read().decode('utf-8')
mmap_object.seek(0)
if not content:
print('Error while reading mmap object')
with open('my_dummy_file.txt', 'w') as f:
f.write('Hello world')
with open('my_dummy_file.txt', 'r') as f:
mmap_object = mmap.mmap(f.fileno(), 0, prot = mmap.PROT_READ)
threads = []
for i in range(64):
threads.append(MmapReading())
threads[i].daemon = True
threads[i].start()
for thread in threading.enumerate():
if thread != threading.current_thread():
thread.join()
print('Mmap reading testing done!')
Когда я запускаю этот скрипт, я получаю около 20 сообщений об ошибках.
Есть ли способ обойти эту проблему, кроме того, чтобы сделать 64 копии каждого файла (что бы потреблять слишком много памяти в моем случае)?
Я понимаю, что происходит. Вопрос в том, как его избежать? – Roman
@Roman: уже ответил. – mhawke