OP 希望对文件进行多线程访问,而不是跨多个程序甚至网络。
因此我说YES你可以这样做。
例如:
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()
为了说明我对 风险 的含义,我在 job_queue 中复制了作业。
注意 [CLASH] 行,如果没有 control,进程 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
结论,如果你没有这样的重复部分,你可以不用锁定。
我建议每个进程/线程使用一个文件句柄。