并发编程(三),线程安全,Lock锁以及线程池的使用

目录线程安全问题1.什么是线程安全问题?2.Lock锁线程池 ThreadPoolExecutor线程池原理使用线程池的好处ThreadPoolExecutor 的使用语法使用线程池改造爬虫程序线程安全问题1.什么是线程安全问题?线程安全是指,函数或者某个函数库在多线程的模式被调用时,能够正确处理多个线程之间共享变量,使得程序可以正常运行。线程调用时线程之间会随时发生切换会发生不可预料的结果,出现线程不安全。2.Lock锁为什么要出现lock锁银.
摘要由CSDN通过智能技术生成

目录

线程安全问题

1.什么是线程安全问题?

2.Lock锁

 线程池 ThreadPoolExecutor

线程池原理

使用线程池的好处

ThreadPoolExecutor 的使用语法

使用线程池改造爬虫程序


线程安全问题

1.什么是线程安全问题?

线程安全是指,函数或者某个函数库在多线程的模式被调用时,能够正确处理多个线程之间共享变量,使得程序可以正常运行。

线程调用时线程之间会随时发生切换会发生不可预料的结果,出现线程不安全。

2.Lock锁

为什么要出现lock锁

银行取钱案例:

金钱总数:1000¥

取钱人员A,准备从中取走600,这时银行代码要 if 总数>所取金额。在判断的过程中B也要去取钱,B也取了600,这时A那边刚判断完,要取钱了发现出现-200¥,取钱机器崩溃。

Lock锁的出现就是让一个线程可以完整的执行,不会出现多线程访问同一资源的出现数据混乱。其操作方式就是一个线程去抢锁,抢到锁了去执行,没有抢到锁的无法执行,只有等待尺有锁的线程释放才能抢锁执行。

使用Lock的两种方式:

import threading

lock = threading.Lock()

lock.acquire()

try:

        # do threading

finally:

        lock.release()

import threading

lock = threading.Lock()

with lock:

        # do threading

代码:

import threading
import time

# 未加锁,取钱失败案例
class Bank():
    def __init__(self, amout):
        self.amout = amout

    def draw_money(self, money, bank):
        if bank.amout >= money:

            print(threading.current_thread().name,'取钱成功')
            time.sleep(0.1)
            bank.amout -= money
            print(threading.current_thread().name, '余额{}'.format( bank.amout))
        else:
        
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值