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()

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

python 使用threading模块解决多线程问题_第1张图片

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()

最后生成的结果为:
python 使用threading模块解决多线程问题_第2张图片
我们终于找到财富密码辣!

才怪。

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

线程锁

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

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

代码如下所示。

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()

最后结果如下:
python 使用threading模块解决多线程问题_第3张图片

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

转载注明出处

你可能感兴趣的:(python,python,多线程,thread)