今天在⾃学⽣产者消费者模型时,发现了⼀个有趣的⽅法
if: 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-8import threadingimport 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()
特此记录,学⽽时习之!
因篇幅问题不能全部显示,请点此查看更多更全内容