1 , python 暂停继续线程Python3, 使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间 。
2 , 线程同步的几种实现方法java中多线程的实现方法有两种:1.直接继承thread类;2.实现runnable接口;同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步。其中多线程实现过程中需注意重写或者覆盖run()方法,而对于同步的实现方法中使用较常使用的是利用synchronized编写同步方法和代码块 。
3,Python有GIL为什么还需要线程同步你自己想想看这个情景线程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的解释速度.多线程操作多个独立字典. 那样还是要同步.那为什么不采用多进程呢? 这就是社区主流的看法.虽然理论上线程成本更低, 但是那样代码就改成面目全非了..【python 线程同步,python 暂停继续线程】
4,python 多线程状态threading.active_count()Return the number of Thread objects currently alive. The returned count is equal to the length of the list returned by enumerate().active_count可以返回当前活动的线程枚举我一般是这么用的 def getHeatsParallel(self): threads = [] for i in range(0, self.threadCount): t = threading.Thread(target=self.SomeFunction, name=str(i)) threads.append(t) t.start() for t in threads: t.join()不过我不关心几个活动,因为指定最多就是threadCount个线程谁说python多线程支持不好,比起ruby , 比起perl,好的不要太多 。python有很多实现多线程的方法:1.挂锁2.queue 队列3.信号机也可以自己构建循环缓冲区我自己总结的构建线程的一些思路:抽象出共享空间,就是读线程和写线程均要访问的那块区域--临界区域,在这个对象里面设置读方法和写方法,并挂锁,也就说不能有2个或者2个以上的线程同时操作共享区域 , 挂锁 的时候注意死锁问题 。这就是基本的线程同步了,如果要加上缓冲就要考虑记录每个线程操作到什么位置,就是位置信息 。代码不贴了,看我blog里面有几个写python的http://hi.baidu.com/linuxbird只要记得几个思路就可以了5,python多线程几种方法实现Python进阶(二十六)-多线程实现同步的四种方式临界资源即那些一次只能被一个线程访问的资源,典型例子就是打印机,它一次只能被一个程序用来执行打印功能,因为不能多个线程同时操作,而访问这部分资源的代码通常称之为临界区 。锁机制threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁import threadingimport timeclass Num:def __init__(self):self.num = 0self.lock = threading.Lock()def add(self):self.lock.acquire()#加锁,锁住相应的资源self.num += 1num = self.numself.lock.release()#解锁,离开该资源return numn = Num()class jdThread(threading.Thread):def __init__(self,item):threading.Thread.__init__(self)self.item = itemdef run(self):time.sleep(2)value = http://www.lisdn.com/gkrj/shwd/n.add()#将num加1,并输出原来的数据和+1之后的数据print(self.item,value)for item in range(5):t = jdThread(item)t.start()t.join()#使线程一个一个执行12345678910111213141516171819202122232425262728当一个线程调用锁的acquire()方法获得锁时 , 锁就进入“locked”状态 。每次只有一个线程可以获得锁 。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”(参见多线程的基本概念) 。直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态 。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态 。信号量信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置 。import threadingimport timeclass Num:def __init__(self):self.num = 0self.sem = threading.Semaphore(value = 3)#允许最多三个线程同时访问资源def add(self):self.sem.acquire()#内部计数器减1self.num += 1num = self.numself.sem.release()#内部计数器加1return numn = Num()class jdThread(threading.Thread):def __init__(self,item):threading.Thread.__init__(self)self.item = itemdef run(self):time.sleep(2)value = n.add()print(self.item,value)for item in range(100):python 的gil规定每个时刻只能有一个线程访问python虚拟机 , 所以你要用python的多线程来做计算是很不合算的,但是对于io密集型的应用,例如网络交互来说 , python的多线程还是非常给力的 。如果你是一个计算密集型的任务 , 非要用python来并行执行.
推荐阅读
- 压力 温度 流量信号数据分析软件
- 图片转为pdf怎么弄,图片转为pdf怎么弄
- java开发工具idea,intellij idea the java ide是个什么工具
- 如何让戴尔服务器连接网络? 戴尔服务器怎么联网
- mongodb一般存什么 mongodb很吃内存吗
- c 访问远程Access c访问mongodb
- mongodb存储图片和文件实践 mongodb存储表单
- mongodb update mongodb打补丁
- 简述什么是长征精神 简述什么是MongoDB