python3.x - Python 多进程操作文件,文件锁好像并没有生效
本文介绍了python3.x - Python 多进程操作文件,文件锁好像并没有生效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
import multiprocessing
import json
import time
import fcntl
def init():
with open('list.txt', 'w') as f:
f.write(json.dumps({'sids': {}}))
def list(data=None):
if data is None:
with open('list.txt', 'r') as f:
fcntl.lockf(f.fileno(), fcntl.LOCK_EX)
print(f.read())
return json.loads(f.read())
else:
with open('list.txt', 'w') as f:
fcntl.lockf(f.fileno(), fcntl.LOCK_EX)
f.write(json.dumps(data))
def generate(sid):
target = 'http://www.baidu.com'
data = list()
data['sids'][sid] = target
print(len(data['sids']))
list(data)
time.sleep(5)
if __name__ == '__main__':
init()
processes = []
for i in range(100):
p = multiprocessing.Process(target=generate, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
几乎所有进程都报 json 解码错误
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
解决方案
报这个错是因为你
return json.loads(f.read())
前面用了
print(f.read())
所以你json.loads的参数始终都是空字符串,所以一直报错。
另外,同意楼上说的不要随便用list这种关键字,到时候坑死自己。
给你一段参考的代码吧,你自己领会一下加锁哪里出问题了。
import multiprocessing
import json
import time
import fcntl
def init():
with open('list.txt', 'w') as f:
f.write(json.dumps({'sids': {}}))
def list_tmp(sid, target):
with open('list.txt', 'r+') as f:
fcntl.flock(f, fcntl.LOCK_EX)
text = f.read()
data = json.loads(text)
data['sids'][sid] = target
f.seek(0)
f.truncate()
f.write(json.dumps(data))
def generate(sid):
target = 'http://www.baidu.com'
list_tmp(sid, target)
time.sleep(5)
if __name__ == '__main__':
init()
processes = []
for i in range(100):
p = multiprocessing.Process(target=generate, args=(i,))
processes.append(p)
p.start()
for p in processes:
p.join()
这篇关于python3.x - Python 多进程操作文件,文件锁好像并没有生效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文