我在多线程环境中使用以下代码:
with open("UrlDict.json",'a') as f:
json.dump([text,href],f)
f.write('\n')
但是当一个线程正在添加到我想要的文件时,另一个线程执行f.write('\ n')方法并且它会混乱。有没有办法在转储json中的项目后插入换行符(我希望每个项目占用一行)。
答案 0 :(得分:3)
您要创建的是JSON lines文件。
使write
成为原子操作。调用json.dumps
,将转储的数据作为字符串获取,并将其与\n
一起写入文件。
j = json.dumps([text, href])
f.write(j + '\n')
答案 1 :(得分:1)
如果要确保线程中的操作是原子操作,请使用锁定。一次只有一个线程可以进入with lock
部分,因此您可以根据需要进行多次操作。
import threading
import json
def mythread(lock):
D = {'one':1,'two':2,'three':3}
for _ in range(100):
with lock, open("UrlDict.json",'a') as f:
json.dump(D,f)
f.write('\n')
lock = threading.Lock()
p1 = threading.Thread(target=mythread,args=(lock,))
p2 = threading.Thread(target=mythread,args=(lock,))
p1.start()
p2.start()
p1.join()
p2.join()