python线程锁,线程同步中线程锁如何使用

1,线程同步中线程锁如何使用synchronized锁住对象!看哪个线程能先选取得对象的锁,就能先买到这股票
2,python除了互斥锁还有什么锁python提供了“可重入锁”:threading.RLock 。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数 , 从而使得资源可以被多次require 。直到一个线程所有的acquire都被release,其他的线程才能获得资源 。这里以例1为例,如果使用RLock代替Lock,则不会发生死锁!普通的一个多线程小例子 。我一笔带过地讲一讲 , 我创建了一个继承thread类的子类mythread , 作为我们的线程启动类 。按照规定 , 重写thread的run方法 , 我们的线程启动起来后会自动调用该方法 。于是我首先创建了10个线程,并将其加入列表中 。再使用一个for循环 , 开启每个线程 。在使用一个for循环 , 调用join方法等待所有线程结束才退出主线程 。
3,python线程有几种锁普通的一个多线程小例子 。我一笔带过地讲一讲,我创建了一个继承Thread类的子类MyThread,作为我们的线程启动类 。按照规定 , 重写Thread的run方法,我们的线程启动起来后会自动调用该方法 。于是我首先创建了10个线程 , 并将其加入列表中 。再使用一个for循环,开启每个线程 。在使用一个for循环,调用join方法等待所有线程结束才退出主线程 。1.线程和进程:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除 。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈) 。2.线程、进程与协程:线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员协程存在的意义:对于多线程应用,cpu通过切片的方式来切换线程间的执行,线程切换时需要耗时(保持状态,下次继续) 。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序 。协程的适用场景: 当程序中存在大量不需要cpu的操作时(io),适用于协程;【python线程锁,线程同步中线程锁如何使用】
4,请教关于python线程的两个问题是这样的,去掉GIL没有太大的价值,而且在新版本的python(包括python3k)也是不会取消的 。在1999年Greg Stein和Mark Hammond创建了一个去掉GIL的1.5分支,将GIL替换为细粒度锁 。但是,做过了基准测试之后,结果令人失望,在最好的情况下 , 单线程的效率只有原来的一半 。另外去掉 GIL 将会造成对解释器的大量的重写,它会使扩展模块变得复杂,一旦扩展有任何的全局可变数据,将不得不为多线程并发调用做好准备 。也可能需要对Python/C API进行改动 , 它们是为了在一系列的调用中需要对某种对象加锁所需要的 。出于以上考虑,Guido尽管欢迎有人来维护一个无GIL的python分支,但他本人不会花太多精力 。最后,尽管不会取消GIL, 但是着并不意味着不能充分利用多cpu,有一下几种方法:1.可以创建多个进程而不是线程 , 进程数和cpu一样多 。2.使用Jython 或 IronPython,可以得到真正的多线程 。这个问题 也许不是很好说, 但是可以这么说python是建立在虚拟机也就是pythonxx.dll上运行的 ,  所以在这个进程里面所有的线程都是基于轮询方式来调度线程的,当然你也可以开多个实例,所以python的线程并不不是内核级的多线程,也不是os级的 而是基于虚拟机之上的 ,  当然Python多线程这块,我也一直期望他改进,不过作为动态语言 , 现在这样架构够用 。第二你说的不能更好的利用cpu资源,这个不用担心,python如果多线程 , 还是可以充分利用的,我们这边有上万行的Python程序跑起来空运行占几MB内存cpu也不高,如果任务来了,可以占到1-2G的内存 和大量的CPU所以你不必担心不会充分利用cpu的问题,这个应该跟你的程序结构和算法 , 以及任务调度的关系的!5,python有了GIL为什么还有线程锁GIL是限制同一个进程中只有一个线程进入Python解释器 。。。。。而线程锁是由于在线程进行数据操作时保证数据操作的安全性(同一个进程中线程之间可以共用信息 , 如果同时对数据进行操作,则会出现公共数据错误)其实线程锁完全可以替代GIL,但是Python的后续功能模块都是加在GIL基础上的 , 所以无法更改或去掉GIL,这就是Python语言最大的bug…只能用多进程或协程改善,或者直接用其他语言写这部分你自己想想看这个情景线程ab同时操作listlist的[0]初始值为0线程a 操作100次list[0]+=1线程b 操作100次list[0]+=1在线程a 对于 list[0]进行操作时list[0]为0, 还没等线程a完成加一操作, 就被切换到线程b了在线程b 眼里,list[0]还是为0, 于是执行加一操作.再切换回线程a, 继续未完成的加一操作你发现了没!!! 线程ab各对list[0]进行了加一,预期结果是2 但结果还是1python的list不是完全线程安全的.所以加个线程锁就完了.话说为什么, 有了线程锁还需要gil呢?因为, 有了gil, 提供并发就变得很容易. 解释器只要计算每个线程的运行时间就好了时间一到, 将这个线程冻结, 内存管理很简单.等等, 你还是没解释, 如果我已经给线程上了锁, 为什么还是要被gil限制?一向符合人类直觉的python, 有个很反直觉的机制.py的变量a其实不是c系编译语言的变量.python维护着一个字典, 储存着a和对应数值的指针.用某黑python的大牛的话说, python企图用字典装下世界..如果变成真多线程对于这个字典的维护将会很复杂.多个线程真正同时操作一个字典, python引以为傲的字典性能, 估计就没那么强了.就是说, python字典的性能强大,是建立在线程不安全的基础上.而字典在python中的位置又是如此重要, 一个缓慢的字典, 会严重拖慢python的解释速度.多线程操作多个独立字典. 那样还是要同步.那为什么不采用多进程呢? 这就是社区主流的看法.虽然理论上线程成本更低, 但是那样代码就改成面目全非了..

    推荐阅读