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()
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.com/{}".format(i), self.sem)
html_thread.start()
if __name__ == '__main__':
sem = threading.Semaphore(3)
url_producer = UrlProducer(sem)
url_producer.start()