将JSON转储到多线程环境中的文件

时间:2018-01-08 01:26:13

标签: python json multithreading

我在多线程环境中使用以下代码:

with open("UrlDict.json",'a') as f:
     json.dump([text,href],f)
     f.write('\n')

但是当一个线程正在添加到我想要的文件时,另一个线程执行f.write('\ n')方法并且它会混乱。有没有办法在转储json中的项目后插入换行符(我希望每个项目占用一行)。

2 个答案:

答案 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()