python 多线程
python 多线程
阿豪boy 发表于5个月前
python 多线程
  • 发表于 5个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

不加锁,会有同步问题,同一变量同时被不同线程使用

# coding=utf-8
import threading
import time
import random

all = 15
class FetchUrl(threading.Thread):
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.id = id

    def run(self):
        global all
        while all > 0:
            time.sleep(0.1)
            all = all - 1
            time.sleep(0.1)
            print(all, self.id)

for i in range(3):
    f = FetchUrl(i)
    f.start()
12 0
12 1
12 2
9 1
9 0
9 2
6 1
6 2
6 0
3 1
3 0
3 2
0 1
0 0
0 2

 

加锁后正常了,用try...finally来确保锁一定会被释放。

锁的好处就是确保了某段关键代码只能由一个线程从头到尾完整地执行,坏处当然也很多,首先是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下降了。其次,由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成死锁,导致多个线程全部挂起,既不能执行,也无法结束,只能靠操作系统强制终止。

# coding=utf-8
import threading
import time
import random

all = 100

lock = threading.Lock()


class FetchUrl(threading.Thread):
    def __init__(self, id):
        threading.Thread.__init__(self)
        self.id = id

     def run(self):
        # 先要获取锁:
        lock.acquire()
        try:
            global all
            while all > 0:
                time.sleep(0.1)
                all = all - 1
                time.sleep(0.1)
                print(all, self.id)
        finally:
            # 确保一定可以释放锁
            lock.release()


for i in range(10):
    f = FetchUrl(i)
    f.start()
14 0
13 0
12 0
11 0
10 0
9 0
8 0
7 0
6 0
5 0
4 0
3 0
2 0
1 0
0 0

 

标签: python 线程
共有 人打赏支持
粉丝 5
博文 507
码字总数 386453
×
阿豪boy
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: