多进程中遇到的问题

以下实例中:

import threading
lock = threading.Lock()
num = 0
def work1(asd):global numfor i in range(asd):num += 1print('在当前的线程修改过后的num是',num)def work2(asd):global numfor i in range(asd):num += 1print('在当前的线程修改过后的num是',num)if __name__ == '__main__':t1 = threading.Thread(target=work1,args=(1000000,))t2 = threading.Thread(target=work2, args=(1000000,))t1.start()t2.start()
-------------------------------------------------------结果
在当前的线程修改过后的num是 1320928
在当前的线程修改过后的num是 1307852

我们发现,当给到work1与work2中的数字过大时,多线程执行完之后与我们所想要得到的结果并不一样。
这是因为线程1(work1)正在执行,但并未执行完就被线程2(work2)抢断执行,导致num在赋值的过程中并没有给到其他线程这个值,所以累加时数字重复导致得到的结果小于正确值。
为此,我们在过程中添加进程锁保证该进程执行完毕之后再交给其他线程执行

import threading
lock = threading.Lock()
num = 0
def work1(asd):global numfor i in range(asd):flag = lock.acquire(True)if flag:num += 1lock.release()print('在当前的线程修改过后的num是',num)def work2(asd):global numfor i in range(asd):flag = lock.acquire(True)if flag:num += 1lock.release()print('在当前的线程修改过后的num是',num)if __name__ == '__main__':t1 = threading.Thread(target=work1,args=(1000000,))t2 = threading.Thread(target=work2, args=(1000000,))t1.start()t2.start()
------------------------------------------------------结果在当前的线程修改过后的num是 1926363在当前的线程修改过后的num是 2000000

但互斥锁只能确保其中一个执行结果正确

互斥锁
优点:解决了资源争抢的问题
缺点:变为了单线程,可能会变成死锁

多进程中的进程锁(互斥锁)相关推荐

  1. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  2. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型...

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  3. android 线程互斥锁,线程锁(互斥锁Mutex)及递归锁

    一.线程锁(互斥锁) 在一个程序内,主进程可以启动很多个线程,这些线程都可以访问主进程的内存空间,在Python中虽然有了GIL,同一时间只有一个线程在运行,可是这些线程的调度都归系统,操作系统有自身 ...

  4. 自旋锁/互斥锁/读写锁/递归锁的区别与联系

    自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁 ...

  5. PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...

  6. 可重入锁(递归锁) 互斥锁属性设置

    前言: 上一次刷博客的时候,看到了自旋锁,通过学习Linux内核,对自旋锁有了一定的了解.在学习的过程中看到这么一句话--自旋锁是不可递归的.自旋锁不可递归,难道有可以递归的锁?带着这个问题,我们来看 ...

  7. JUC锁-互斥锁ReentrantLock(二)

    ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可 ...

  8. 自己如何实现自旋锁,互斥锁和读写锁

    锁 C语言协程库实现 锁是很常见的同步原语,那么锁的实现原理是怎样的呢?下面我们就自己模拟实现一下各种锁来更好地理解锁的实现和代价. 自旋锁 自旋锁是一种成本较低的锁,因为它只会在当前cpu循环忙等直 ...

  9. Python 进程互斥锁 Lock - Python零基础入门教程

    目录 一.Python 线程互斥锁和进程互斥锁 1.创建线程互斥锁 2.创建进程互斥锁 二.进程互斥锁 Lock 函数介绍 三.进程互斥锁 Lock 使用 案例一:使用进程,但不使用互斥锁 案例二:进 ...

最新文章

  1. 预训练图像处理Transformer
  2. linux的txt转为windows的txt
  3. 杀毒软件为什么不能启动、运行
  4. bat判断文本中是否存在一个相同内容比较_Excel中的9个逻辑函数都不掌握,还敢称Excel达人?...
  5. servlet监听完成统计在线人数,显示在线人员列表(附源码)
  6. 战斧湖战役之后的5rnm
  7. Linux课程实践二:编译模块实现内核数据操控
  8. 永恒之塔 java_AionChs
  9. 使用Qemu模拟Cortex-A9运行U-boot和Linux
  10. mysql myisam写入性能_(转)innodb 与 myisam 读写性能分析
  11. 本科是最底层?学历真的那么重要么?
  12. 2019-4(2)-数据挖掘学习笔记
  13. LeetCode(9)Palindrome Number
  14. 架构设计师(Architect)的专业与角色
  15. ABAP术语-Implementation
  16. Hibernate常用配置
  17. 树莓派查看cpu温度的命令
  18. 全面了解电商网站建设要点,看这一篇就够了
  19. 2022年第十三届蓝桥杯大赛软件省赛Java学B组试题
  20. 网站被黑中毒WebShell木马的解决方案

热门文章

  1. 网格员计算机考试基础知识,网格员考题_请问下网格员考试的内容题目是什么要复习什么_淘题吧...
  2. LeetCode——11. 盛最多水的容器
  3. centos7.2安装dcos
  4. ab进行压力测试详解
  5. Tower of Hanoi (汉诺塔问题)
  6. GreenPlum-6 最简步骤安装
  7. NTP 时间服务器配置
  8. Kryo:快速、高效的序列化框架
  9. Java标识符的命名规则有哪些
  10. 运维标准化与流程化建设深度指南(转)