使用队列进行线程通信时的优化

我之前在https://blog.csdn.net/qq_35423190/article/details/107943081(用队列实现并行处理数据不加锁)中使用队列,意图实现使用队列不加锁

由于工作经验浅薄,没有意识到这个问题,直到leader和我说封装的队列结构内部是加锁的,不然实现不了Queue.size()

(当然,不适用封装队列而是手动使用数组实现循环队列时,就不会有锁)

虽然python的队列结构Queue在多线程传数据时确实是安全的,但是仍有不停的加锁,导致频繁使用一个队列进行io时,速度会非常慢,因为中间有大量等待锁释放和申请锁的时间。

新流程

在意识到这个问题后,我将原来直接用队列进行传数据的结构改成了以下的流程:

1.申请 i 个固定长度 j 的数组结构 a[ i ][ j ]

2.一个数组结构 a[i] 在同一时间只允许进行写入或者只允许进行读取

3.原先由队列进行传输数据改成由队列传输数组编号 i

4.生产者端(写数据端),从队列中获取 i ,然后数据写入到 a[i] 中直到写满

5.生产者端(写数据端),将已经写满的数组的编号 i 传给消费者端(读数据端)

6.消费者端(读数据端),从队列中获取 i ,然后从 a[i] 中读数据直到读完

7.消费者端(读数据端),将已经读完的数组的编号 i 传给生产者端(写数据端)

 

这样,每一个写线程或者读线程都不会在锁操作上花费太多时间,处理时间会明显加快

 

时间对比:

3kw数据处理:

 开始时间结束时间运行时间
使用队列进行线程间的通信2020-08-19 15:01:182020-08-19 15:18:3517:17
使用新流程进行线程间通信2020-08-21 15:19:032020-08-21 15:21:592:56

速度提高了5倍到6倍

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aiky哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值