一个业务逻辑实现思路想问问大家

2019-09-16 14:37:24 +08:00
 smallgoogle

我当前是使用 queue 单向队列;

我需要实现功能如下:
从数据库拉取数据,然后放入队列,然后多线程进行访问;
线程每次使用 queue.get 获取一条数据访问;结束业务的时候又把数据 put 到队尾;
一直循环;

我另外还有一个线程,一直监听一个接收事件,如果接收到数据,就往队列里插入数据;
那么问题来了,如果我想中间的时候往队列里增加数据 或者 删除数据怎么办? 比如我想删除队列里的某一个数据,好像 queue 不支持从中间删除数据。
我这样的业务逻辑是不是不应该使用队列?

4243 次点击
所在节点    Python
27 条回复
Amit
2019-09-16 14:44:40 +08:00
这里没看出来哪里一定需要队列,queue.get 每次获取一条数据,数据还有插入删除的操作,不如直接使用数据库实现一个链表,定时任务每次查询一条头部记录
smallgoogle
2019-09-16 14:49:08 +08:00
@Amit 因为不想每次都从数据库里拉数据,想第一次启动的时候就拉出数据放在队列,然后利用队列会锁住数据的功能,让多线程不会执行到同一条数据。
speedofstephen
2019-09-16 14:55:24 +08:00
额 linkedlist 其实实现了 Queue
xstoop
2019-09-16 15:05:05 +08:00
感觉你的队列使用有问题,一般队列的消费者跟生产者是分开的
Lax
2019-09-16 15:07:08 +08:00
“队列会锁住数据” ???这是个什么原理
smallgoogle
2019-09-16 15:07:37 +08:00
@xstoop 我认为我使用队列是有问题的,但是应该使用啥,我就是不知道 = =
smallgoogle
2019-09-16 15:08:30 +08:00
@Lax 我想表达的是,我多线程的时候,他们不会取到同一条数据的意思。 = =
workspace
2019-09-16 16:17:38 +08:00
关键字 redis list pop
workspace
2019-09-16 16:20:16 +08:00
另外可看下最近基于 redis 实现的一个简单队列: https://github.com/lgphone/delay-queue
tt67wq
2019-09-16 16:43:48 +08:00
redis zset 可以的,用分数来维持顺序
xstoop
2019-09-16 17:02:03 +08:00
@smallgoogle 抛开你说的队列,线程这些。你大概描述一下你要实现的业务需求是什么呢
raysonlu
2019-09-16 19:17:33 +08:00
有点好奇你的业务,消费者每次消费完毕,都放回队列,然后又有一个生产者往队列塞东西,最后这个队列岂不是越滚越大? BTW,插队这种不恶劣行为估计是做不了的,删除的话,你可以再维护一个删除名单表让每次消费队列的时候都查询一下。zset 可以维持顺序,但消费者只能是定时任务中运行了。
alexzhu592
2019-09-16 19:25:09 +08:00
@Lax 他应该是说的是阻塞
alexzhu592
2019-09-16 19:27:49 +08:00
你的业务不适合用队列,想其他办法吧
hspeed18
2019-09-17 02:10:19 +08:00
为什么不说一下你的业务需求是什么,用队列的理由是什么?
ziding
2019-09-17 09:21:27 +08:00
感觉你是用错了,如果有任务优先级的要求,你应该用优先队列,而不是普通队列。如果用普通队列,要求能够撤回某些消息,应该用业务补偿,回滚的方式进行处理,而不是中间取消掉某个任务。
hellotime
2019-09-17 09:54:04 +08:00
还是抛出原始需求比较好
smallgoogle
2019-09-17 10:31:24 +08:00
@hspeed18
@hellotime
@alexzhu592
@raysonlu
@xstoop
从看一下帖子不,我更了一下原始需求,给点高见;
raysonlu
2019-09-17 10:45:37 +08:00
像你说的,存放数据的地方,是个池或者数组,可以满足你增删需求,然后处理数据是个队列,可以满足多线程需求,那么,池归池,队列归队列,再找一个单线程的方法,让池中的数据迅速流入队列不就好了?
hellotime
2019-09-17 11:04:58 +08:00
@smallgoogle 这哪是原始需求,你的原始需求应该类似是我想搞一个代理网站,逐个测试一下代理,如果代理不行了就遗弃,可以的就保存起来,待下次检测。原始需求指的是产品要啥功能,而不是你做为开发说你要个队列。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/601172

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX