day37-多进程多线程二-锁
Lock组件
当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,如果两个文件同时进行,肯定是不行的,必须是文件写结束以后,才可以进行读操作。或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就要有一个锁机制进行控制。
acquire()
locked()
release() //释放锁,使用前线程必须已获得锁定,否则抛出异常
lock=thread.allocate_lock():生成锁对象
lock.acquire():加锁
线程使用锁对象
lock.release(): 线程调度释放锁
查看locked()状态
获得一把锁,把对放的锁释放
threading 高级别多线程模块
threading 不需要进程的控制来控制线程
threading.Thread: 类
成员方法:
start() 启动
run() 重写
join() 阻塞
getName()
setName()
isDaemon() 判断线程是否随主线程一起结束
setDaemon() 设置线程与主线程一起结束
共享内存
python的multiprocessing模块也给我们提供了共享内存的操作
一般的变量在进程之间是没法进行通讯的,multiprocessing给我们提供了Value和Array模块,他们可以在不通的进程中共同使用
例子:
import multiprocessing #lock = multiprocessing.Lock()
#lock.acquire() 获取锁
#lock.release() 释放锁
#with lock: 加锁 import time # Value()
# Array()
def add(number,add_value,lock):
lock.acquire()
try:
print("init add{0} number = {1}".format(add_value,number.value))
for i in xrange(1,6):
number.value += add_value
print("############add{0} has added#######".format(add_value))
time.sleep(1)
print("add{0} number = {1}".format(add_value,number.value))
except Exception as e:
raise e
finally:
lock.release()
def change(arr):
for i in range(len(arr)):
arr[i] = -arr[i] if __name__ == "__main__":
lock = multiprocessing.Lock() #加锁
number = multiprocessing.Value('i',0) #共享内存
arr = multiprocessing.Array('i',range(10)) #共享内存数组
print(arr[:])
p1 = multiprocessing.Process(target=add,args=(number,1,lock))
p2 = multiprocessing.Process(target=add, args=(number, 3,lock))
p3 = multiprocessing.Process(target=change, args=(arr,))
p1.start()
#p1.join()
p2.start()
##p2.join()
p3.start() #启动
p3.join()
print(arr[:])
print("main end") 输出结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
init add1 number = 0
############add1 has added#######
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
main end
add1 number = 1
############add1 has added#######
add1 number = 2
############add1 has added#######
add1 number = 3
############add1 has added#######
add1 number = 4
############add1 has added#######
add1 number = 5
init add3 number = 5
############add3 has added#######
add3 number = 8
############add3 has added#######
add3 number = 11
############add3 has added#######
add3 number = 14
############add3 has added#######
add3 number = 17
############add3 has added#######
add3 number = 20
day37-多进程多线程二-锁的更多相关文章
- java多线程(二)——锁机制synchronized(同步方法)
synchronized Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码.当两个并发线程访问同一个对象object中 ...
- Python 多线程、多进程 (二)之 多线程、同步、通信
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- Java 多线程:锁(二)
Java 多线程:锁(二) 作者:Grey 原文地址: 博客园:Java 多线程:锁(二) CSDN:Java 多线程:锁(二) AtomicLong VS LongAddr VS Synchroni ...
- Python 多进程 多线程 协程 I/O多路复用
引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...
- python多进程(二)
之前实现的数据共享的方式只有两种结构Value和Array.Python中提供了强大的Manager专门用来做数据共享的,Manager是进程间数据共享的高级接口. Manager()返回的manag ...
- python爬虫入门八:多进程/多线程
什么是多线程/多进程 引用虫师的解释: 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期. 进程(有时被称为重量级进程)是 ...
- gdb常用命令及使用gdb调试多进程多线程程序
一.常用普通调试命令 1.简单介绍GDB 介绍: gdb是Linux环境下的代码调试⼯具.使⽤:需要在源代码⽣成的时候加上 -g 选项.开始使⽤: gdb binFile退出: ctrl + d 或 ...
- python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!
首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都 ...
- 也说性能测试,顺便说python的多进程+多线程、协程
最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下 一.分析接口频率 根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以 ...
随机推荐
- 读取excel日期数据问题
1.企业导入数据,遇到日期数据, excel中显示日期格式正常 2009/3/13, 结果利用npoi读出来的竟然是 13-3月-2009,特别奇葩. so把excel中的日期数据统一成文本.利用Te ...
- HttpRunner 接口自动化简单实践
1.安装 1.1 命令行pip直接安装就好 1.2 验证安装 命令行输入hrun -V,返回项目版本信息则表明安装成功 2.新建测试项目 这里我用直接通过框架的脚手架工具命令生成目录结构 如:hrun ...
- python locust 性能测试:locust 关联---提取返回数据并使用
from locust import HttpLocust, TaskSet, taskimport jsonfrom common import readConfig class UserBehav ...
- Solr复杂条件查询
solr复杂查询条件查询(排序.过滤.高亮) 简单案例: package cn.kingdee; import java.util.List; import java.util.Map; import ...
- arcgis 制图-插值图
1.生成插值图 插值工具: 方案1:Spatial Analyst 工具-->插值分析-->反距离权重法 (IDW) + Spatial Analyst 工具-->提取分析--> ...
- springboot之jar包部署步骤
eclipse中: 1.单击整个项目 run as - maven clean - maven install 2.找到项目所在的路径 找到所有的jar包 3.把jar包放到linux对应的文件夹 l ...
- Got error -1 when reading table
环境:Percona Server for MySQL 5.5.18 模拟三个Terminal,实现当引用锁定表的查询被杀死时,错误日志中出现的Got error -1 when reading ta ...
- [c/c++] programming之路(24)、字符串(五)——字符串插入,字符串转整数,删除字符,密码验证,注意事项
1.将字符串插入到某位置(原字符串“hello yincheng hello cpp hello linux”,查找cpp,找到后在cpp的后面插入字符串“hello c”) 需要用到strstr字符 ...
- python 的运行方式和基础变量
机器语言:直接用计算机能听的懂得二进制去编写程序,需要了解硬件细节 优点:执行效率高 缺点:开发效率低汇编语言:用英文单词取代二进制指令去编写程序 优点:开发效率高于机器语言 缺点:执行效率低于机器语 ...
- COCO数据集格式互换
poly->compacted RLE: seg=np.array([312.29, 562.89, 402.25, 511.49, 400.96, 425.38, 398.39, 37 ...