python多线程

python多线程

python多线程简介

python多线程时间并非是并行得,而是并发的,是多线程交替执行达到得并发效果

单线程实现食堂打饭操作

需求: 一个人打四份饭耗时

import time
"""
io密集型
"""
foods = 0
import threading

def get_food():
    """
    食堂大妈打饭
    """
    global foods
    time.sleep(1)
    foods += 1
    print("大妈打了一份饭")


def take_food(name="1"):
    """
    学生去打饭
    """
    while foods < 4 :
        time.sleep(1)
        get_food()
        time.sleep(1)
        print(name + "打饭完成")

t1 = time.time()
take_food()
t2 = time.time()
print("一个人打完4份饭的时间==", t2-t1)

输出结果:
大妈打了一份饭
1打饭完成
大妈打了一份饭
1打饭完成
大妈打了一份饭
1打饭完成
大妈打了一份饭
1打饭完成
一个人打完4份饭的时间== 12.092403650283813

多线程实现食堂打饭

import time

"""
io密集型
"""
import threading

foods = 0
lock = threading.Lock()


def get_food():
    """
    食堂大妈打饭
    """
    global foods
    time.sleep(1)
    foods += 1
    print("大妈打了一份饭")
    
def take_food(name="1"):
    """
    学生去打饭
    """

    global foods, lock
    lock.acquire()
    time.sleep(1)
    get_food()
    time.sleep(1)
    print(name + "打饭完成")
    print("foods值为", foods)
    lock.release()


# 多线程
t1 = time.time()
for i in range(3):
    th = threading.Thread(target=take_food, args=(str(i),))
    th.start()
t2 = time.time()
print("3个人打完4份饭的时间==", t2 - t1)

输出结果:
3个人打完4份饭的时间== 0.0010788440704345703
大妈打了一份饭
0打饭完成
foods值为 1
大妈打了一份饭
1打饭完成
foods值为 2
大妈打了一份饭
2打饭完成
foods值为 3

多线程实现取钱

  • 未加锁
    import threading
    import time

    banlence = 800
    
    
    def with_draw(money,name):
        global banlence
        if money <= banlence:
            banlence -= money
            print(name + "取钱成功")
            print("可用余额:", banlence)
        else:
            print(name + "取钱失败")
    
    
    th1 = threading.Thread(target=with_draw, args=(500, "张三"))
    th2 = threading.Thread(target=with_draw, args=(500, "李四"))
    th1.start()
    th2.start()
    """
    输出结果:
    张三取钱成功
    可用余额: -200
    李四取钱失败
    """
    
  • 加锁
    # 多线程去取钱时数据不安全,需要加锁

    banlence = 800
    lock = threading.Lock()
    
    
    def with_draw(money, name):
        global banlence, lock
        # 加锁
        lock.acquire()
        if money <= banlence:
            time.sleep(0.1)
            banlence  = banlence - money
            print(name + "取钱成功")
            print(threading.current_thread().name)
    
            print("可用余额:", banlence)
        else:
            print(name + "取钱失败")
        # 释放安全锁. 线程2要使用这个方法时需要等线程1使用完
        lock.release()
    
    
    th1 = threading.Thread(target=with_draw, args=(500, "张三"))
    th2 = threading.Thread(target=with_draw, args=(500, "李四"))
    th1.start()
    th2.start()
    """
    张三取钱成功
    Thread-1
    可用余额: 300
    李四取钱失败
    """
    
posted @ 2022-08-26 17:21  jiyanjiao  阅读(130)  评论(0编辑  收藏  举报