前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python|多进程的lock机制

Python|多进程的lock机制

作者头像
用户1278550
发布于 2019-08-12 07:42:03
发布于 2019-08-12 07:42:03
2.2K00
代码可运行
举报
文章被收录于专栏:idbaidba
运行总次数:0
代码可运行

一 前言

我们知道Python中多进程是相互执行互不干扰的,但是如果多进程之间需要对同一资源对象进行操作或者多个进程之间有相互依赖的,那就需要一个共享变量供多进程使用。Python multiprocessing 多进程之间相互协调的方式有如下几种: Lock:锁,Queue:队列, Semaphore:信号量 ,Event:事件,Pipe:管道 。

后续文章会逐个介绍这几种方式,本文学习 Lock:锁 。

二 实践

当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。思考一个场景无事务状态下共同访问某个内存变量或者多个进程要访问读写同一个文件。

初始化lock很简单:

lock = Lock() 即可创建一个锁对象,

该对象为全局对象,能被所有的子进程使用。

2.1 no lock
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/8/10 5:48 PM
func:
"""
from multiprocessing import Process, Value, Lock


def sub(num):
    num.value += 1
if __name__ == '__main__':
    lock = Lock() # 创建锁对象
    val = Value('i', 0) # Value是通过共享内存的方式共享数据 初始值 val 为0
    proc = [Process(target=sub, args=(val,)) for i in xrange(100)]
    for p in proc:
        p.start()
    for p in proc:
        p.join()

    print '经过100次累加之后 val 的值是: %d' %val.value

结果

因为共享内存中的val能被同时访问,存在val=90 的时候 ,被多个并发加1结果val=91 ,比如3次,结果就是val=98

2.2 lock
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# encoding: utf-8
"""
author: yangyi@youzan.com
time: 2019/8/10 5:38 PM
func:
"""
from multiprocessing import Process, Value, Lock


def sub(num,lock): # 传入的lock对象
    lock.acquire() # 申请锁,lock对象变为locked,并且阻塞其他进程获取lock对象
    num.value += 1
    lock.release() # 释放锁,lock对象变为unlocked,其他进程可以重新获取lock对象
if __name__ == '__main__':
    lock = Lock() # 创建锁对象
    val = Value('i', 0)
    proc = [Process(target=sub, args=(val,lock)) for i in xrange(100)]
    for p in proc:
        p.start()
    for p in proc:
        p.join()

    print '经过100次累加之后 val 的值是: %d' % val.value

利用lock 就能将+1 的动作串行化。确保不会发生写覆盖的现象。

结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yangyidba 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python标准库11 多进程探索 (multiprocessing包)
在初步了解Python多进程之后,我们可以继续探索multiprocessing包中更加高级的工具。这些工具可以让我们更加便利地实现多进程。 进程池 进程池 (Process Pool)可以创建多个进
Vamei
2018/01/18
6150
Python标准库11 多进程探索 (multiprocessing包)
python之多进程multiproce
multiprocessing是要比fork更高级的库了,使用multiprocessing可以更加轻松的实现多进程程序。multiprocessing也提供了很多进程同步和进程通信的方法。
py3study
2020/01/06
3840
Python多进程编程
阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiprocessing python 中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进 程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支
小小科
2018/05/02
1.2K0
Python多进程编程
Python 学习笔记 - 多进程和进程
前面学习了多线程,接下来学习多进程的创建和使用。多进程更适合计算密集型的操作,他的语法和多线程非常相像,唯一需要注意的是,多线程之间是可以直接共享内存数据的;但是多进程默认每个进程是不能访问其他进程(程序)的内容。我们可以通过一些特殊的方式(队列,数组和字典)来实现,注意这几个数据结构和平常使用的不太一样,是在多进程中特殊定义的。
py3study
2020/01/09
4450
Python 多进程
#_*_coding:utf-8_*_ __author__ = 'jieli' import time import multiprocessing ''' 线程多锁是不需要当成参数传多,因为线程之间是共享内存多。 但是进程之间多锁是需要当成参数传的,因为进程之间的内存是独立的 多进程之间加锁是为了防止同时对一个文件做操作等等 ''' def run(num,l):     time.sleep(1)     #l.acquire()     print "hello, my name is:",n
py3study
2020/01/10
3050
python多进程—multiproce
    python中提供多进程包:multiprocessing,支持子进程,通信,共享内存,执行不同形式的同步,提供了Process、Pipi、Lock等组件
py3study
2020/01/06
3560
一篇文章梳理清楚 Python 多线程与多进程
在学习Python的过程中,有接触到多线程编程相关的知识点,先前一直都没有彻底的搞明白。今天准备花一些时间,把里面的细节尽可能的梳理清楚。
吾非同
2021/12/13
1.1K0
一篇文章梳理清楚 Python 多线程与多进程
【Python基础编程】全面解析进程、进程通信与生产者-消费者模式
上篇文章主要了解python的线程,如何创建线程,如何通过线程实现生产者-消费者模式以及线程池的使用等等,接下来这篇文章讲解python的进程,有问题欢迎一起探讨。
易辰君
2024/11/07
1020
在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value
Python 自带的多进程库 multiprocessing 可实现多进程。我想用这些短例子示范如何优雅地用多线程。中文网络上,有些人只是翻译了旧版的 Python 官网的多进程文档。而我这篇文章会额外讲一讲下方加粗部分的内容。
汀丶人工智能
2023/10/11
9.5K0
在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value
Python 编程 | 连载 25 - Python 多进程
对于操作系统来说,一个任务就是一个进程,进程就是程序执行的载体,如Python脚本中执行main函数就启动了一个进程,打开微信或者浏览器就是开启了一个进程,进程的运行需要资源支持,也就需要消耗CPU和内存
RiemannHypothesis
2022/09/26
3830
Python 编程 | 连载 25 - Python 多进程
Python 多进程开发与多线程开发
进程提供了多道编程,充分发挥了计算机部件的并行性,提高了计算机的利用率,既然进程这么优秀,为什么还要线程呢? 其实,还是有很多缺陷的,主要体现在两点上:
py3study
2020/01/06
6030
Python 进阶(二):多进程
进程:通常一个运行着的应用程序就是一个进程,比如:我启动了一个音乐播放器,现在它就是一个进程。线程:线程是进程的最小执行单元,比如:我在刚启动的音乐播放器上选了一首歌曲进行播放,这就是一个线程。
Python小二
2020/08/18
4530
浅谈 multiprocessing
一前言 使用python进行并发处理多台机器/多个实例的时候,我们可以使用threading ,但是由于著名的GIL存在,实际上threading 并未提供真正有效的并发处理,要充分利用到多核CPU,我们需要使用多进程。Python提供了非常好用的多进程包--multiprocessing。multiprocessing 可以利用multiprocessing.Process对象来创建一个进程,该Process对象与Threading对象的用法基本相同,具有相同的方法(官方原话:"The multiprocessing package mostly replicates the API of the threading module.") 比如:start(),run(),join()的方法。multiprocessing包中也有Lock/Event/Semaphore/Condition/Pipe/Queue类用于进程之间的通信。话不多说 show me the code! 二使用 2.1 初识异同
用户1278550
2018/08/08
4470
Python|多进程的事件Event
我们知道Python中多进程是相互执行互不干扰的,但是如果多进程之间需要对同一资源对象进行操作或者多个进程之间有相互依赖的,那就需要一个共享变量供多进程使用。Python multiprocessing 多进程之间相互协调的方式有如下几种: Lock:锁,Queue:队列, Semaphore:信号量 ,Event:事件,Pipe:管道 。
用户1278550
2019/08/12
6.1K0
Python|多进程的事件Event
python中的多进程处理
  众所周知,python本身是单线程的,python中的线程处理是由python解释器分配时间片的;但在python 3.0中吸收了开源模块,开始支持系统原生的进程处理——multiprocessing. 注意:这个模块的某些函数需要操作系统的支持,例如,multiprocessing.synchronize模块在某些平台上引入时会激发一个ImportError 1)Process   要创建一个Process是很简单的。
py3study
2020/01/13
7440
第十五章 Python多进程与多线程
multiprocessing是多进程模块,多进程提供了任务并发性,能充分利用多核处理器。避免了GIL(全局解释锁)对资源的影响。
py3study
2020/01/09
7790
python多进程编程-多进程编程的优势和劣势
在Python编程中,多进程编程是一种重要的技术手段。Python作为一种高级编程语言,天生具有多线程编程的特性,但是由于GIL(Global Interpreter Lock)的存在,线程在并发执行的效率较低。多进程编程则是一种有效的解决方案。
玖叁叁
2023/04/20
4310
py基础---多线程、多进程、协程
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位,一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程中并发执行不同的任务。
py3study
2020/01/16
6730
py基础---多线程、多进程、协程
python爬虫入门八:多进程/多线程
但如果数据量很大,比如要通过访问数百数千个url去爬取数据,单线程必须等待当前url访问完毕并且数据提取保存完成后才可以对下一个url进行操作,一次只能对一个url进行操作;
py3study
2020/01/19
1.6K0
Python3 多进程与多线程
进程和线程是操作系统层面的概念,本质上就是两个操作系统内核对象:即操作系统定义的两个数据结构,操作系统通过这两个数据结构,来管理程序的运行。 (1)以多进程形式,允许多个任务同时运行; (2)以多线程形式,允许单个任务分成不同的部分运行; (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
嵌入式视觉
2022/09/05
4540
相关推荐
Python标准库11 多进程探索 (multiprocessing包)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验