我之前在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:18 | 2020-08-19 15:18:35 | 17:17 |
使用新流程进行线程间通信 | 2020-08-21 15:19:03 | 2020-08-21 15:21:59 | 2:56 |
速度提高了5倍到6倍