广州的房地产网站建设,金城武重庆森林经典台词,石家庄学设计的正规学校,东家乐装修公司简介1、 背景概述
在上篇文章中#xff0c;主要讲述了python中的socket编程的一些基本方面#xff0c;但是缺少关于锁的相关概念#xff0c;从而在这篇文章中进行补充。 由于在python中#xff0c;存在了GIL#xff0c;也就是全局解释器锁#xff0c;从而在每次进行获得cpu的…1、 背景概述
在上篇文章中主要讲述了python中的socket编程的一些基本方面但是缺少关于锁的相关概念从而在这篇文章中进行补充。 由于在python中存在了GIL也就是全局解释器锁从而在每次进行获得cpu的时候同时只有一个线程获得了cpu的运行在这个方面可以认为是线程安全的但是在线程运行的时候是共享内存的共享相同的数据信息从而这个时候python的线程就不那么安全了。 在python中要保证数据的正确性并且自己对数据进行控制对数据进行加锁并且自己释放锁。 多线程的主要目的为了提高性能与速度用在无关的方向是最好的例如在使用爬虫的时候可以使用多线程来进行爬取数据因为在这些线程之间没有需要共同操作的数据从而在这个时候利用是最好的。 如果需要操作同一份数据那么必须自己保证数据的安全性。 如果需要利用多cpu的特性那么应该使用的是多进程编程而不是多线程编程多进程编程为multiprocessing。 2、 利用锁进行同步相同的数据
直接看以下的代码 #!/usr/bin/env python
import time
import threadingnum 0
class MyThread(threading.Thread):def run(self):#lock.acquire()#time.sleep(1)global numnum 1print self.name set num to str(num)#lock.release()#lock threading.RLock()
threads []
for i in range(10000):t MyThread()threads.append(t)
for i in range(10000):threads[i].start()
for i in range(10000):threads[i].join()
看以上的代码对全局变量进行一个修改从而每个线程取到的是同一份的数据从而可能造成数据的计算结果不正确从而需要用锁进行控制数据的正确性。 PS在我的机器上进行运行的时候都是正确的从而看起来好像不用锁也可以但是在有的机器上进行模拟的时候最后的计算结果不正确。 在使用锁的时候只要将注释的代码进行去掉即可使用锁。 3、 锁的类型
在python的threading模块中提供了三种锁如下所示 在进行锁的操作的时候必须在每个线程中自己获取锁然后自己释放锁否则会造成一直在等待也可以称之为死锁。 4、 事件
在进行多线程的时候可以判断一个事件发生然后触发做另外的事情从而可以使用event如下代码所示 [rootpython 523]# cat thread_demo.py
#!/usr/bin/env pythonimport threading
import time
import Queuedef producter(name,queue,lock):event.clear()print %s start to product... % namequeue.put(something)time.sleep(3)print product somethingevent.set()event.wait()def consumer(name,queue,lock):print %s start to consume... % nameevent.wait()queue.get()print consume somethingevent.set()lock threading.Lock()
queue Queue.Queue(10)
event threading.Event()
threads []
threadsc []
for i in range(1):t threading.Thread(targetproducter,args(kel%s % i,queue,lock))threads.append(t)
for i in range(1):threads[i].start()
for i in range(1):t threading.Thread(targetconsumer,args(smile%s % i,queue,lock))threadsc.append(t)
for i in range(1):threadsc[i].start() 在使用event的时候clear表示将flag设置为falseset表示设置为truewait表示在false的时候一直等待从而当producter没有数据的时候consumer一直在等待。 这种可以做事件的触发。 问题
在进行此实验的时候如果线程出现错误那么是无法关闭的从而只有杀掉进程才可以从而可以使用命令如下 killall python 杀掉进程的同时杀掉线程。可以杀死进程但是线程是无法杀掉的