文档章节

python线程锁实践实例

 酒醉东坡
发布于 2016/07/19 08:48
字数 374
阅读 2
收藏 0

写这篇文章之前,我想起了一句实践出真知的诗,感觉就在嘴边但就是记不起来,最后百度之。

。 。 。 。 。 。

纸上得来终觉钱,绝知此事要躬行。

。 。 。 。 。 。

唯有实践出真知,学以致用才是学习的终点。

 

注意点一:

主进程(也叫主线程)也是可以请求和释放线程锁的。

 

注意点二:

线程锁必须是全局的,这样方能实现在主线程(就是进程)和子线程之间切换。

 

注意点三:

线程锁只在有请求锁的线程中生效,对第三方未请求锁的线程不起作用。

 

使用场景:

1,多个线程操作同一个共享变量的时候,避免共享变量出错,(两个线程同时修改变量,导致出错)。

2,让主线程阻塞,即下一步操作需要线程结果的时候,等待线程操作执行结果,其实是上边的特殊情况。

 

下面是例子,很好的解释了上面提到的三点注意项和场景类。

 

# coding:utf-8
import threading
import time
balance = 0

class ThreadTestO(threading.Thread):
    def __init__(self, lock):
        threading.Thread.__init__(self)
        self.lock = lock

    def run(self):
        global balance
        while True:
            print "other thread"
            time.sleep(1)


class ThreadTest(threading.Thread):
    def __init__(self, lock):
        threading.Thread.__init__(self)
        self.lock = lock

    def run(self):
        global balance
        while True:
            self.lock.acquire()
            print "thread"
            print balance
            time.sleep(10)
            balance += 1
            self.lock.release()


if __name__ == "__main__":
    lock = threading.RLock()
    thread = ThreadTest(lock)
    thread.setDaemon(True)
    thread.start()

    threado = ThreadTestO(lock)
    threado.setDaemon(True)
    threado.start()

    while True:
        lock.acquire()
        print "main thread"
        print balance
        balance += 1
        time.sleep(1)
        lock.release()


 

 

 

© 著作权归作者所有

粉丝 1
博文 30
码字总数 14441
作品 0
郑州
程序员
私信 提问
王老板Python面试(10):17道python笔试面试真题

1、一行代码实现1--100之和 利用sum()函数求和 2、如何在一个函数内部修改全局变量 利用global 修改全局变量 3、列出5个python标准库 os:提供了不少与操作系统相关联的函数 sys: 通常用于命...

程序员八阿哥
2018/05/22
0
0
Python自由之路(三) 多线程处理

今天学习Python的多线程机制,在Python中主要使用Threading 模块,当然也有thread模块,只是这里面的功能比较单一,而Threading 模块是在thread的基础上进行的扩展,就像Python Document 上说...

ysisl222
2009/08/17
0
0
Python 并发模型

Python及线程 vs 微线程(微进程) vs Greenlets 最近,我有注意到论坛上有很多询问线程,微线程及绿色线程并发模型之间的具体区别的问题。问题诸如 它们的实现有什么不同? microthreads/g...

oschina
2013/05/30
2.3K
0
使用 Python 进行线程编程

对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程、进程和异步 I/O 的支持。在许多情况下,通过创建诸如异步、线程和子进程之类的高层模块,Python 简化了各种并发方法的使用。除...

丰圣谋
2013/08/22
0
0
《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)

序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试和调试分布式应用 第8章...

seancheney
2017/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

错误代码0x800700c1 VS2019加载项目就闪退

--win10更新错误代码0x800700c1 解决方法:把防火墙什么的关了。然后重启下电脑。在检查更新,最后我把杀毒。卫士什么的卸载了。 退出360安全卫士,重新运行vs2019,成功!!! Windows软件异...

南风末
19分钟前
0
0
免费的编程中文书籍索引

免费的编程中文书籍索引 免费的编程中文书籍索引,欢迎投稿。 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版。 stackoverflow 上的程序员应该阅读的非编程类书籍有哪些? 中文版...

TreeZhou0511
33分钟前
2
0
线程池之ThreadPoolExecutor使用

ThreadPoolExecutor提供了四个构造方法: ThreadPoolExecutor构造方法.png 我们以最后一个构造方法(参数最多的那个),对其参数进行解释: public ThreadPoolExecutor(int corePoolSize, /...

天王盖地虎626
51分钟前
5
0
小程序登陆流程

http://www.bubuko.com/infodetail-2592845.html

为何不可1995
今天
1
0
Consul+Spring boot的服务注册和服务注销

一图胜千言 先看一看要做事情,需要在Consul上面实现注册中心的功能,并以2个Spring boot项目分别作为生产者,消费者。 Consul 假设已经完成文章《Consul的开发者模式之Docker版》中的所有的...

亚林瓜子
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部