多线程编程中,有时候一个数据,只能有一个线程进行“写”;但是可以有多个线程进行“读” ;
怎样控制只有一个线程写呢?
解决 用threading中的Semaphore
使用方法
from threading import Thread,Semaphore
import time
class gethtml(Thread):
def __init__(self,sem,url):
self.sem = sem
self.url = url
super(gethtml, self).__init__(name="小爱同学")
def run(self):
time.sleep(2)
print(self.url)
self.sem.release() # 4 永远要记得释放锁
def mypass(sem):
for i in range(20):
sem.acquire() # 3 永远要记得落锁
th = gethtml(sem, i)
th.start()
# 1 实例化
sem = Semaphore(3)
# 2 丢到线程里,变成线程实例的一个属性
thread = Thread(target=mypass,args=(sem,))
thread.start()
>>>
0
1
2
---
3
4
5
....
- 实例sem = Semaphore(3) 是控制线程只有三个,本质是会变成实例中self._value = 3 语句
- 每一个sem.acquire() 执行 ,就证明有一个线程落锁了,所以self._value - 1;
- 当 value变成0 就会一直等待,等待原来的线程执行完毕后sem.release()解锁掉,此时self.value + 1;又可以放进来新得线程了
改进,把他们全部类化
from threading import Thread,Semaphore
import time
class gethtml(Thread):
def __init__(self,sem,url):
self.sem = sem
self.url = url
super(gethtml, self).__init__(name="小爱同学")
def run(self):
time.sleep(2)
print(self.url)
self.sem.release()
class geturl(Thread):
def __init__(self,sem):
self.sem = sem
super().__init__(name="天猫精灵")
def run(self):
for i in range(20):
self.sem.acquire()
th = gethtml(self.sem,i)
th.start()
if __name__ == "__main__":
sem3 = Semaphore(3)
thread = geturl(sem3)
thread.start()
网友评论