python 锁机制

锁(LOCK)

当有两个或跟多个线程或进程需要操作一个变量或进程时,会出现意想不到的结果,这是因为线程或进程时迸发进行的,对同意变量或文件操作时,会出现同时对其操作,从到导致逻辑错误。

#!/bin/usr/env python
#coding:utf-8
import multiprocessing
import time
class multF(multiprocessing.Process):
    """docstring for multF"""
    def __init__(self,filename,proname,stime):
        multiprocessing.Process.__init__(self)
        self.filename = filename
        self.proname  = proname
        self.stime    = stime
    def run(self):
        with open(self.filename,‘a‘) as f:
            for x in xrange(1,5):
                f.write("进程编号:"+str(self.proname)+"---"+str(x)+‘\n‘)
                time.sleep(self.stime)
        f.close()
        print u"文件写入完成."
def main():
    filename = ‘./test.txt‘
    t1 = multF(filename,‘01‘,2)
    t2 = multF(filename,‘02‘,1)
    t3 = multF(filename,‘03‘,2)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    print u"结束"   
if __name__ == ‘__main__‘:
    main()

为解决以上问题我们需要引入锁。

锁有两种状态:被锁(locked)和没有被锁(unlocked)。拥有acquire()和release()两种方法,并且遵循以下的规则:

如果一个锁的状态是unlocked,调用acquire()方法改变它的状态为locked;
如果一个锁的状态是locked,acquire()将会阻塞,直到另一个线程或进程调用release()方法释放它;
如果一个锁的状态是unlocked,调用release()会抛出RuntimeError异常;
如果一个锁的状态是locked,调用release()方法改变它的状态Wieunlocked。

解决上面两个进程或线程同时写一个文件的问题的方法就是:我们给写文件的类的构造器中传入一个锁(lock),使用这个锁来保护文件操作,实现在给定的时间只有一个线程写文件。

#!/bin/usr/env python
#coding:utf-8
import multiprocessing
import time
class multF(multiprocessing.Process):
    """docstring for multF"""
    def __init__(self,filename,proname,stime,lock):
        multiprocessing.Process.__init__(self)
        self.filename = filename
        self.proname  = proname
        self.stime    = stime
        self.lock       = lock
    def run(self):
        with open(self.filename,‘a‘) as f:
            self.lock.acquire()
            for x in xrange(1,5):
                f.write("进程编号:"+str(self.proname)+"---"+str(x)+‘\n‘)
                time.sleep(self.stime)
        f.close()
        self.lock.release()
        print u"文件写入完成."
def main():
    filename = ‘./test2.txt‘
    lock = multiprocessing.Lock()
    t1 = multF(filename,‘01‘,2, lock)
    t2 = multF(filename,‘02‘,1,lock)
    t3 = multF(filename,‘03‘,2,lock)
    t1.start()
    t2.start()
    t3.start()
    t1.join()
    t2.join()
    t3.join()
    print u"结束"   
if __name__ == ‘__main__‘:
    main()
时间: 2024-10-05 15:29:57

python 锁机制的相关文章

python 多线程锁机制

GIL(全局解释器锁) GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念,是为了实现不同线程对共享资源访问的互斥,才引入了GIL 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 python对于计算密集型的任务开多线程的效率甚至不如串行(没有大量切换),但是,对于IO密集型的任务效率还是有显著提升的. GIL原理图 计算密集型:结果肯定是100,因为每一次start结果就已经出来了,所以第二个线程肯

《python源码剖析》笔记 python多线程机制

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.GIL与线程调度 Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用 为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL. GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下

大数据技术之_29_MySQL 高級面试重点串讲_02_Mysql 简介+Linux 版的安装+逻辑架构介绍+性能优化+性能分析+查询截取分析+分区分库分表简介+锁机制+主从复制

第1章 Mysql 简介1.1 概述1.2 高级 MySQL第2章 Mysql Linux 版的安装2.1 下载地址2.2 检查当前系统是否安装过 mysql2.3 修改 Mysql 配置文件位置2.4 修改字符集和数据存储路径2.5 MySQL 的安装位置说明2.6 Mysql 配置文件说明2.7 Mysql 的数据存放目录第3章 Mysql 逻辑架构介绍3.1 总体概览3.2 查询说明第4章 Mysql 性能优化4.1 影响 mysql 的性能因素4.2 查询与索引优化分析4.2.1 性能下

JAVA synchronized关键字锁机制(中)

synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选. 下面总结其特性以及使用技巧,加深对其理解. 特性: 1. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.       2. 当一个线程同时访问object的一个synchronized(this)同步代码块时,其它线程仍然可以访问非修饰的方法或代码块.       3. 当多个线程同时访问object的synchronized(this)同步代码

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

【Python&数据结构】 抽象数据类型 Python类机制和异常

这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Python编程,借着本次机会仔细学习一下. 抽象数据类型 最开始的计算机语言,关注的都是如何更加有效率地计算,可以说其目的是计算层面的抽象.然而随着这个行业的不断发展,计算机不仅仅用于计算,开发也不仅只关注计算过程了,数据层面的抽象也变得同样重要.虽然计算机语言一开始就有对数据的抽象,但是那些都只是对一些最基本的

Mysql事务,并发问题,锁机制-- 幻读、不可重复读(转)

1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成功,要不全部撤销 隔离性:事务之间相互独立,互不干扰 一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏 持久性:事务的提交结果,将持久保存在数据库中 2.事务并发会产生什么问题 1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时更新一行数据,但是第二个事务却中途失败退出, 导致对数据的两个修改都失效了. 例如: 张三的工资为5000,事务A中获取工资为5000,事务B获取工资为5

【转】数据库锁机制

1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程.T3,T4以此类推.下面以SQL Server(2005)为例. 2 锁的种类 共享锁(Shared lock). 例1: ---------------------------------------- T1: select * from table (请想象它需要执行

Mysql中那些锁机制之InnoDB

我们知道mysql在曾经.存储引擎默认是MyISAM.可是随着对事务和并发的要求越来越高,便引入了InnoDB引擎.它具有支持事务安全等一系列特性. InnoDB锁模式 InnoDB实现了两种类型的行锁. 共享锁(S):同意一个事务去读一行,阻止其它事务获得同样的数据集的排他锁. 排他锁(X):同意获得排他锁的事务更新数据,可是组织其它事务获得同样数据集的共享锁和排他锁. 能够这么理解: 共享锁就是我读的时候,你能够读,可是不能写.排他锁就是我写的时候.你不能读也不能写.事实上就是MyISAM的