IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 【python多线程】3:如何把多个大象装进多个冰箱 -> 正文阅读

[Python知识库]【python多线程】3:如何把多个大象装进多个冰箱

对Thread不了解的朋友,可以参看这篇:Python多线程之Thread类

大家都知道,要把大象装冰箱,总共分三步:把冰箱门打开、把大象装进去、把冰箱门关上,尤其想把多个大象装进多个冰箱的时候,更要注意这一点。

如果简化成简单的判断:如果这个冰箱里没有大象,则把大象装进这个冰箱,就会出现很严重的后果: α \alpha α β \beta β同时发现冰箱A里没有大象,于是分别把大象a和b装进了冰箱A——这就十分危险了。

所以,在把大象装进冰箱之前,一定要先判断这个门是不是开着,如果门是开的,那不好意思,这个冰箱已经有人用了;如果门是关的,那么好了,打开冰箱看看里面有没有大象。

线程锁,就相当于是冰箱门,如果不开门直接判断,那么结果如下

from random import randint
from threading import Thread
from time import sleep
fridges = [0 for _ in range(10)]    #10个冰箱

# 把大象装冰箱的函数
def e2f():
    for x in range(10):
        if fridges[x]==0:   #若冰箱里没有大象,则把大象装进去
            sleep(0.1)      #装冰箱需要一点时间→_→
            fridges[x] += 1
            return x
ths = [Thread(target=e2f) for _ in range(10)]
for t in ths: t.start()

最后一看,果然大象都装第一个冰箱里了,因为每个线程在判断的时候,第一个冰箱都是空的。

>>> fridges
[10, 0, 0, 0, 0, 0, 0, 0, 0, 0]

如果使用lock,看看会有什么好的结果没。。

from threading import Thread, RLock
from time import sleep

lock = RLock()
fridges = [0 for _ in range(10)]    #10个冰箱

def e2f():
    for x in range(10):
        if fridges[x]==0:
            sleep(0.1)      #装冰箱需要一点时间→_→
            fridges[x] += 1
            return x

def E2FwithLock(L):
    while(True):
        if L.acquire(False):	#把冰箱门打开
            e2f()
            L.release()			#把冰箱门关上

ths = [Thread(target=E2FwithLock,args=[lock]) for _ in range(10)]
for t in ths: t.start()

由于阻塞的原因,这个程序会运行得很慢,但最后得到的结果是比较不错的

>>> fridges
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:26:19  更:2021-11-09 19:26:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:02:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码