python 使用threading模块解决多线程问题

什么是线程

线程是操作系统能够进行运算调度的最小单位。进程被包含在进程中,是进程中实际处理单位。一条线程就是一堆指令集合。

一条线程是指进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

在python中实现多线程

下面来看一下在python中最简单的一个多线程模型:

import threading
import time


def mission1(num):
    for i in range(0, num):
        print("mission1......" + str(i))
        time.sleep(1)                                            # 此处要插入间隔,否则看不出多线程的区别


def mission2(num):
    for i in range(0, num):
        print("mission2......" + str(i))
        time.sleep(1)


if __name__ == '__main__':
    m1 = threading.Thread(target=mission1, args=(5, ))           # target为任务名,args为传递进任务的参数
    m2 = threading.Thread(target=mission2, args=(5, ))

    m1.start()                                                   # 开始任务
    m2.start()

在执行后,我们可以看到如下的结果:

在这里插入图片描述

ATM取款所造成的隐患

上次逛贴吧看到了个异想天开的想法,假设你银行卡里有1000块,使用两台机器同时登入这张卡(这里槽点就已经很大了,但请忽略),此时两台机器所识别的这张卡的余额都是1000块,这时候操作机器的两个人同时按下取款1000块,机器就会吐出2000块。

按照这位朋友的想法,用代码模拟大概是这个样子:

import threading
import time

account = 1000

def withdraw(num):
    global account
    if num <= account:
        time.sleep(1)                # 给予判断的余地
        t = account - num
        account = t
        print("已取出" + str(num))
    else:
        print("余额不足")


if __name__ == '__main__':
    m1 = threading.Thread(target=withdraw, args=(1000, ))
    m2 = threading.Thread(target=withdraw, args=(1000, ))

    m1.start()
    m2.start()

最后生成的结果为:
在这里插入图片描述
我们终于找到财富密码辣!

才怪。

现实生活中,不说两台机器读一张卡的神奇操作,在线程锁的存在下,这种一生二,二生三,三生万物的操作也是不存在的。

线程锁

多个线程同时执行任务,且访问同一资源时,对资源的同步操作很可能会导致很大的安全隐患。

线程锁就是保护公共资源,一次只能让一个线程访问。

代码如下所示。

import threading
import time

account = 1000

def withdraw(num):
    global account
    lock.acquire()                   # 加锁
    if num <= account:
        time.sleep(1)                # 给予判断的余地
        t = account - num
        account = t
        print("已取出" + str(num))
    else:
        print("余额不足")
    lock.release()                   # 解锁


if __name__ == '__main__':
    lock = threading.Lock()          # 生成锁

    m1 = threading.Thread(target=withdraw, args=(1000, ))
    m2 = threading.Thread(target=withdraw, args=(1000, ))

    m1.start()
    m2.start()

最后结果如下:
在这里插入图片描述

关于threading剩下的操作等下篇文章介绍吧(如果有的话)

转载注明出处

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值