首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python线程:并发读取/写入文件中的多个互斥部分可以吗?

Python线程:并发读取/写入文件中的多个互斥部分可以吗?
EN

Stack Overflow用户
提问于 2017-03-04 14:49:30
回答 2查看 789关注 0票数 0

我知道,我们可以通过锁定或使用一个专门的线程来保证正确性,该线程的唯一任务是通过队列与其进行读写和通信。

但是这种方法在逻辑上似乎是可以的,所以我想避免实现它们,特别是因为两者都有性能损失。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-04 14:58:14

一般情况下,不。

并发读写行为在很大程度上取决于底层操作系统文件系统。

您可能可以通过读取和写入块大小为基础块大小的倍数,并对块对齐来工作。但你很可能在“未定义的行为”的世界里。

另见相关问题:How do filesystems handle concurrent read/write?

票数 3
EN

Stack Overflow用户

发布于 2017-03-04 15:07:21

OP希望多线程访问文件,而不是跨多个程序甚至网络访问。因此,我说是的,,你可以这样做。

例如:

代码语言:javascript
运行
复制
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。

输出:

代码语言:javascript
运行
复制
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  

结论,如果你没有这样重复的部分,你可以做到不锁定。

我建议每个进程/线程使用一个文件句柄。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42597341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档