python3.x - Python 多进程操作文件,文件锁好像并没有生效

查看:739
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆