我知道,我们可以通过锁定或使用一个专门的线程来保证正确性,该线程的唯一任务是通过队列与其进行读写和通信。
但是这种方法在逻辑上似乎是可以的,所以我想避免实现它们,特别是因为两者都有性能损失。
发布于 2017-03-04 14:58:14
一般情况下,不。
并发读写行为在很大程度上取决于底层操作系统和文件系统。
您可能可以通过读取和写入块大小为基础块大小的倍数,并对块对齐来工作。但你很可能在“未定义的行为”的世界里。
发布于 2017-03-04 15:07:21
OP希望多线程访问文件,而不是跨多个程序甚至网络访问。因此,我说是的,,,你可以这样做。
例如:
def job_handler(id, job_queue):
fh = open('test')
while True:
time.sleep(0.1)
try:
job = job_queue.get_nowait()
# Do the job
# fh.read(job.offset, job.size)
# Work with data
# fh.write(job.offset, job.size)
except queue.Empty:
fh.close()
exit(0)
if __name__ == '__main__':
job_queue = mp.Queue()
for job in [(0, 100), (200, 100), (200, 100), (100, 100), (300, 100), (300, 100), (400, 100), (500, 100), (400, 100), (600, 100)]:
job_queue.put( job )
processes = []
for p in range(1,4):
processes.append( mp.Process(target = job_handler, args = (p, job_queue) ) )
for p in processes:
p.start()
time.sleep(0.1)
for p in processes:
p.join()为了演示risk的含义,我在job_queue中复制了工作。注意CLASH行,如果没有控制,进程2的rw中就有进程3的rw。
输出:
Start Job handler 1
Start Job handler 2
1: read offset=0
2: read offset=200
Start Job handler 3
3: read offset=200
[CLASH] offset:200 read by process:{2}
1: write offset=0
1: read offset=100
3: write offset=200
2: write offset=200
...
exit(0) job_handler 3
exit(0) job_handler 2
exit(0) job_handler 1 结论,如果你没有这样重复的部分,你可以做到不锁定。
我建议每个进程/线程使用一个文件句柄。
https://stackoverflow.com/questions/42597341
复制相似问题