• 学习python中__name__方法使用


    今天在自学生产者消费者模型时,发现了一个有趣的方法

    if __name__ == "__main__":
        for i in range(2):
            p = Producer()
            p.start()
        for i in range(10):
            c = Consumer()
            c.start()

    于是就去确认了一下度娘,果然好多初学者都会问这个问题,思路解释如下:

    1. 如果模块是被导入,__name__的值为模块名字
    2. 如果模块是被直接执行,__name__的值为’__main__’

    亦或有一些解释

    1:__name__是一个变量。前后加了爽下划线是因为是因为这是系统定义的名字。普通变量不要使用此方式命名变量。
    2:Python有很多模块,而这些模块是可以独立运行的!这点不像C++和C的头文件。
    3:import的时候是要执行所import的模块的。
    4:__name__就是标识模块的名字的一个系统变量。这里分两种情况:假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是__main__,通过if判断这样就可以执行“__mian__:”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“__mian__:”后面的内容。

    通过上面方式,python就可以分清楚哪些是主函数,进入主函数执行;并且可以调用其他模块的各个函数等等。

    上一段生产者消费者模型代码,来判断代码确认可以简化代码健壮性!

    #encoding=utf-8
    import threading
    import time
    condition = threading.Condition()
    products = 0
    class Producer(threading.Thread):
        '''生产者'''
        ix = [0]  # 生产者实例个数
        # 闭包,必须是数组,不能直接 ix = 0
        def __init__(self, ix=0):
            threading.Thread.__init__(self)
            self.ix[0] += 1
            self.setName('生产者' + str(self.ix[0]))
        def run(self):
            global condition, products
            while True:
                if condition.acquire():
                    if products < 10:
                        products += 1;
                        print("{}:库存不足,我努力生产了1件产品,现在产品总数量 {}".
                              format(self.getName(), products))
                        condition.notify()
                    else:
                        print("{}:库存充足,让我休息会儿,现在产品总数量 {}".
                              format(self.getName(), products))
                        condition.wait();
                    condition.release()
                    time.sleep(2)
    class Consumer(threading.Thread):
        '''消费者'''
        ix = [0]  # 消费者实例个数
        # 闭包,必须是数组,不能直接 ix = 0
        def __init__(self):
            threading.Thread.__init__(self)
            self.ix[0] += 1
            self.setName('消费者' + str(self.ix[0]))
        def run(self):
            global condition, products
            while True:
                if condition.acquire():
                    if products > 1:
                        products -= 1
                        print("{}:我消费了1件产品,现在产品数量 {}".
                              format(self.getName(), products))
                        condition.notify()
                    else:
                        print("{}:只剩下1件产品,我停止消费。现在产品数量 {}".
                              format(self.getName(), products))
                        condition.wait();
                    condition.release()
                    time.sleep(2)
    if __name__ == "__main__":
        for i in range(2):
            p = Producer()
            p.start()
        for i in range(10):
            c = Consumer()
            c.start()
    

      特此记录,学而时习之!

  • 相关阅读:
    jqgrid content-type datatype
    github删除
    springcolud文章收藏
    springboot无法加载oracle驱动终极解决
    当多线程并发遇到Actor
    spring.boot 无法加载oracle驱动的可能原因
    MobileNet V2深入理解
    转载:从loss处理图像分割中类别极度不均衡的状况---keras
    6D姿态估计
    An overview of semantic image segmentation
  • 原文地址:https://www.cnblogs.com/paul010/p/11624902.html
Copyright © 2020-2023  润新知