
各位看官不要纠结这段代码的作用。。。 这段代码中有两个注释,加注释和不加注释为什么不一样?
import threading import time def producer(): while True: time.sleep(0.2) lock.acquire() print('producer acquire lock') time.sleep(0.1) time.sleep(0.1) print('producer release lock') lock.release() def consumer(): while True: time.sleep(0.1) #lock.acquire() print('consumer eating') #lock.release() if __name__ == "__main__": lock = threading.RLock() t1 = threading.Thread(target=producer, args=()) t2 = threading.Thread(target=consumer, args=()) t1.start() t2.start() t1.join() t2.join() 加注释运行结果:
consumer eating producer acquire lock consumer eating consumer eating producer release lock consumer eating consumer eating producer acquire lock 不加注释运行结果:
consumer eating producer acquire lock producer release lock consumer eating consumer eating producer acquire lock producer release lock 我觉得加不加注释都应该是 “不加注释运行结果”,
1 lihongjie0209 2019-07-02 10:19:06 +08:00 这段代码也是牛逼, 所有入口持有一把锁, 不管你几个线程都只能串行, 线程越多性能越差 |
2 fuxiuyin 2019-07-02 10:30:31 +08:00 加注释的话,consumer 运行又没有任何限制,为啥要等 producer 释放锁呀。 |
3 ilyh 2019-07-02 10:31:50 +08:00 没毛病啊, 不加注释:consumer 先获取到锁, 然后 producer 再获取到锁, |
4 geelaw 2019-07-02 10:35:34 +08:00 via iPhone 我假设你说的“不加注释”的意思是“不注释掉 consumer 拿锁的两行”。 成语:掩耳盗铃。 |
5 krixaar 2019-07-02 10:48:42 +08:00 加注释:consumer 的运行和 lock 这个锁无关,因此 consumer 的运行和 lock 这个锁无关。 不加注释:consumer 的运行受到 lock 这个锁的限制,因此 consumer 的运行受到 lock 这个锁的限制。 综上:尼克杨问号.jpg |
6 Gakho 2019-07-02 11:24:02 +08:00 不太明白,LZ 是想要 Barrier 或者 Condition 的功能? |
7 Trim21 2019-07-02 11:27:44 +08:00 via iPhone 消费者和生产者用的同一把锁,不注释的情况下,生产者锁没释放消费者拿不到,肯定在 acqure 和 release 之间不会 eat 啊 |
8 wevsty 2019-07-02 11:31:34 +08:00 threading.RLock() 只会导致在已经被加锁的情况下再 lock 同一个锁的时候才会阻塞试图 lock 的线程。 |
9 decemberpei 2019-07-02 11:46:51 +08:00 via iPhone 楼主对 lock 理解有误。lock 的意思是,如果 A 拿到了 lock,这个时候如果 B 也尝试拿,那么 B 就会被 block 住,直到 A 释放了 lock,B 才能拿到 lock 并恢复运行。 加了注释的情况下,B 根本没用尝试拿 lock,当然不会被 block 住, |
10 krixaar 2019-07-02 11:47:05 +08:00 > lock 不阻塞线程吗? 阻塞线程的是 lock.acquire()这一句,注释掉之后就不阻塞了,因为代码里都没提到 lock。 |
11 weyou 2019-07-02 13:19:36 +08:00 via Android @lihongjie0209 实际应用中只会对临界资源加锁,这只是一个多线程锁的例子,没毛病。 |
12 zkqiang 2019-07-03 18:33:34 +08:00 加了注释 consumer 肯定无限循环啊,都跟 lock 没关系了,为啥会跟不加注释一样呢? 好奇楼主咋想的 |