多线程python实例

多线程

1.基本多线程

import threading
import time

def print_numbers():
    for i in range(5):
        time.sleep(1)
        print(f"Thread 1: {i}")

def print_letters():
    for letter in 'ABCDE'://字符串的遍历
        time.sleep(1)
        print(f"Thread 2: {letter}")

# 创建两个线程
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# 启动线程
thread1.start()
thread2.start()

# 等待两个线程执行完成
thread1.join()
thread2.join()

print("Main thread done.")

解释:print_numbersprint_letters 是两个线程执行的函数。threading.Thread 类被用于创建线程对象,start 方法用于启动线程,join 方法用于等待线程执行完成

2.多线程需要解决的问题

1.数据竞争

import threading
import time

# 共享的变量
shared_variable = 0

# 创建锁
lock = threading.Lock()

# 线程执行的函数
def update_shared_variable():
    global shared_variable

    for _ in range(100000):
        # 获取锁
        lock.acquire()

        try:
            # 对共享变量进行操作
            shared_variable += 1
        finally:
            # 释放锁
            lock.release()

# 创建两个线程
thread1 = threading.Thread(target=update_shared_variable)
thread2 = threading.Thread(target=update_shared_variable)

# 启动线程
thread1.start()
thread2.start()

# 等待两个线程执行完成
thread1.join()
thread2.join()

print("Shared variable value:", shared_variable)

解释:两个线程都执行 update_shared_variable 函数,该函数通过获取锁 (lock.acquire()) 来确保对 shared_variable 的操作是原子的。通过 lock.release() 来释放锁,确保其他线程可以获取锁并访问共享资源。

操作是原子的:在多线程编程中,原子操作是一种不可分割的操作,即要么操作完全执行,要么不执行,不存在中间状态

上下文管理器:代码块简化,自动完成锁的获取和释放

import threading
import time

shared_variable = 0
lock = threading.Lock()

def update_shared_variable():
    global shared_variable

    for _ in range(100000):
        # 使用上下文管理器简化锁的管理
        with lock:
            shared_variable += 1



2.死锁

死锁是多线程或多进程编程中一种常见的问题,它发生在两个或多个线程或进程相互等待对方释放资源的情况下

四个条件:1.互斥
		2.占有等待
		3.非抢占条件
		4.循环等待
解决:超时机制,破坏四条件

工厂加工程序


import threading
import time
condtion = threading.Condition()
sheep = ['1件产品','1件产品','1件产品','1件产品','1件产品']
class Producer(threading.Thread):
    def __init__(self, name):
        super().__init__(name=name)
        pass
    def run(self):
        global condtion, sheep
        while True:
            time.sleep(0.1)
            condtion.acquire()
            if len(sheep) < 10:
                print(self.name + "生产了1件产品")
                sheep.append('1件产品')
                condtion.notifyAll()
                pass
            else:
                print("仓库满了,停止生产!")
                condtion.wait()
                pass
            condtion.release()
        pass
    pass
class Customer(threading.Thread):
    def __init__(self, name):
        super().__init__(name=name)
        pass
    def run(self):
        global condtion, sheep
        while True:
            time.sleep(0.1)
            condtion.acquire()
            if len(sheep) > 0:
                meat = sheep.pop()
                print(self.name + "购买了" + meat + "还剩多少" + str(len(sheep)) + "件")
                condtion.notifyAll()
                pass
            else:
                print("买光了,等待")
                condtion.wait()
                pass
            condtion.release()
        pass
    pass
if __name__ == "__main__":
    p1 = Producer("1号生产车间")
    p2 = Producer("2号生产车间")
    p3 = Producer("3号生产车间")
    p4 = Producer("4号生产车间")
    p5 = Producer("5号生产车间")
    p6 = Producer("6号生产车间")
    p1.start()
    p2.start()
    p4.start()
    p5.start()
    p6.start()
    c1 = Customer('小王')
    c2 = Customer('小李')
    c3 = Customer('小贾')
    c4 = Customer('小沈')
    c5 = Customer('小刘')
    c1.start()
    c2.start()
    c3.start()
    c4.start()
    c5.start()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值