python多线程中的condition(条件变量)和semaphore用于控制进入数量的锁

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.com/{}".format(i), self.sem)
            html_thread.start()


if __name__ == '__main__':
    sem = threading.Semaphore(3)
    url_producer = UrlProducer(sem)
    url_producer.start()

你可能感兴趣的:(python)