Luna_Lovegood_001 2021-02-14 09:50 采纳率: 40%
浏览 26

多线程与多进程的数据安全

python 中使用多个进程对一个数据进行操作会导致数据不安全的情况,达不到想要的结果,所以需要加锁,示例:

from multiprocessing import Process,Manager,Lock

def change_dict(dict,lock):
    
    dict['count'] -=1

if __name__ == '__main__':
    with Manager() as m:
        lock = Lock()
        dic = m.dict({'count':100})
        p_l = []
        for i in range(100): # 100 个进程,每个进程减1
            p = Process(target=change_dict,args=(dic,lock))
            p.start()
            p_l.append(p)
        for p in p_l:p.join()
        print(dic) # 多进程没有枷锁,dic可能为1、0 、2 、3等(数据不安全)

但是对于多线程来说,以下代码没有加锁,但也不会出现数据不安全的现象。请问为什么多线程的数据此时是安全的呢?

# 线程之间的数据共享
from threading import Thread
n = 100

def func():
    global  n
    n -=1

t_l = []
for i in range(100):
    t = Thread(target=func)
    t.start()
    t_l.append(t)
for t in t_l:
    t.join()
print(n)
  • 写回答

1条回答 默认 最新

  • 给你骨质唱疏松 2021-02-14 10:26
    关注

    是的, 加互斥锁(同步锁、排他锁), 将局部操作变成串行运行, 牺牲了效率提升了安全性

    评论

报告相同问题?

悬赏问题

  • ¥15 求推荐发表需要付费的深度学习遥感场景分类SCI期刊
  • ¥15 无法在java控制台录入文字
  • ¥15 flutter网页应用用python的http服务器访问速度慢
  • ¥15 VESTA绘图原子颜色显示异常
  • ¥15 天翼云搭建多ip l2tp
  • ¥15 python实现CAD识图
  • ¥15 如何实现在renpy中创建并应用不同大小尺寸对话框?
  • ¥15 table表格有一列是固定列 滑动到最下面时 固定的那一列有几行没显示出来
  • ¥20 单细胞数据注释时报错
  • ¥15 vscode编译ros找不到头文件,cmake.list文件出问题,如何解决?(语言-c++|操作系统-linux)