今天在自学生产者消费者模型时,发现了一个有趣的方法
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()
特此记录,学而时习之!