admin管理员组文章数量:1599543
GIL
- python中一个线程对应于c语言中的一个线程
- gil使得同一时刻只有一个线程在一个cpu上执行字节码,无法将多个线程映射到cpu上执行
- gil会根据执行的字节码行数以及时间片释放gil,gil在遇到io操作的时候也会主动释放
- 锁会影响性能,锁会引起死锁
- condition有两层锁
一把底层锁会在线程调用了wait后释放
上面的锁会在每次调用了wait的时候分配一把并放入到condition的等待队列中等待notify方法的唤醒
import threading
class XiaoAi(threading.Thread):
def __init__(self, cond):
super(XiaoAi, self).__init__(name='小爱')
self.cond = cond
def run(self):
with self.cond:
self.cond.wait()
print("{}:在".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:好啊".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:君住长江尾".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:共饮长江水".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:此恨何时已".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:定不负相思意".format(self.name))
self.cond.notify()
# with self.cond:
# print("{}:好啊".format(self.name))
class TianMao(threading.Thread):
def __init__(self, cond):
super(TianMao, self).__init__(name='天猫精灵')
self.cond = cond
def run(self):
with self.cond:
print("{}:小爱同学".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:我们来对古诗吧".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:我在长江头".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:日日思君不见君".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:此水几时休".format(self.name))
self.cond.notify()
self.cond.wait()
print("{}:只愿君心似我心".format(self.name))
self.cond.notify()
self.cond.wait()
# with self.cond:
# print("{}:我们来对古诗吧".format(self.name))
if __name__ == '__main__':
lock = threading.Condition()
xiaoai = XiaoAi(lock)
tianmao = TianMao(lock)
xiaoai.start()
tianmao.start()
- semaphore用于控制进入数量的锁
import threading
import time
class HtmlSpder(threading.Thread):
def __init__(self, url, sem):
super().__init__()
self.url = url
self.sem = sem
def run(self):
time.sleep(2)
print("got html text success,{}".format(self.url))
self.sem.release()
class UrlProducer(threading.Thread):
def __init__(self, sem):
super().__init__()
self.sem = sem
def run(self):
for i in range(20):
self.sem.acquire()
html_thread = HtmlSpder("https://www.baidu/{}".format(i), self.sem)
html_thread.start()
if __name__ == '__main__':
sem = threading.Semaphore(3)
url_producer = UrlProducer(sem)
url_producer.start()
版权声明:本文标题:python多线程中的condition(条件变量)和semaphore用于控制进入数量的锁 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1728324973a1154316.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论