大家帮忙想个算法

ivan_070 2014-09-13 11:25:18
有个task表,
主键是自增量,其中还有一个status字段,表示任务的状态,0是等待执行;1是执行中;2是执行完成

我们有多台服务器来共同完成任务,每台服务器有多个线程。
每个线程独立执行,从task中获取一个status为0的任务,将status设置为1。

请问怎么让每个服务器上每个线程都能获得一个不重复并且状态是0的任务。
不要用id除以某个值取余数,因为这样会导致有些服务器很忙,有些很空闲。

...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_20750013 2014-09-13
  • 打赏
  • 举报
回复
关注
ivan_070 2014-09-13
  • 打赏
  • 举报
回复
引用 3 楼 xiangnan129 的回复:
你的意思是,要让每个服务器都去获取没有被执行过的<或者是说最近没有被执行过的>任务。 我在想可不可以用一个队列,将所有未执行的任务都放到队列里面,然后每个服务器的每个线程都从队列里面去拿任务,也就是出队列。如果有新的状态为0的任务出现,则入队列。 本人实力不够,暂时只想到了这个拙劣的想法。
这个是比较理想的办法,但是需要额外去开发,我们需要一个简单的办法。
ivan_070 2014-09-13
  • 打赏
  • 举报
回复
引用 2 楼 rumlee 的回复:
[quote=引用 1 楼 ivan_070 的回复:] 我有一个解决办法,感觉不是太好。 每个线程都查询出10条status为0的记录, 遍历每一条,select * from task where id=xxx for update 如果查询出来status是0,则update为1,返回。 请问还有没有比较好的办法。
第一步和第二步为什么不直接并成一步呢,直接一次加update查询10条,然后将这10条更新成1不就可以了。 这个方法完全是可以的,而且也没有什么不好,也很简单。是通过数据库的事务来控制的。 还有一种方法,用一台专用服务器来进行任务的分发,其他服务器进行任务的执行。[/quote] 增加记录锁的时候,最好是用主键,不然容易锁表。 弄专门服务器来分发有点麻烦,我需要一个简单的办法。
skgary 2014-09-13
  • 打赏
  • 举报
回复
引用 楼主 ivan_070 的回复:
有个task表, 主键是自增量,其中还有一个status字段,表示任务的状态,0是等待执行;1是执行中;2是执行完成 我们有多台服务器来共同完成任务,每台服务器有多个线程。 每个线程独立执行,从task中获取一个status为0的任务,将status设置为1。 请问怎么让每个服务器上每个线程都能获得一个不重复并且状态是0的任务。 不要用id除以某个值取余数,因为这样会导致有些服务器很忙,有些很空闲。
那就专门写一个进程用来分配任务好了。 你要想做到完全自治,还是有难度的。
scott_129 2014-09-13
  • 打赏
  • 举报
回复
你的意思是,要让每个服务器都去获取没有被执行过的<或者是说最近没有被执行过的>任务。 我在想可不可以用一个队列,将所有未执行的任务都放到队列里面,然后每个服务器的每个线程都从队列里面去拿任务,也就是出队列。如果有新的状态为0的任务出现,则入队列。 本人实力不够,暂时只想到了这个拙劣的想法。
rumlee 2014-09-13
  • 打赏
  • 举报
回复
引用 1 楼 ivan_070 的回复:
我有一个解决办法,感觉不是太好。 每个线程都查询出10条status为0的记录, 遍历每一条,select * from task where id=xxx for update 如果查询出来status是0,则update为1,返回。 请问还有没有比较好的办法。
第一步和第二步为什么不直接并成一步呢,直接一次加update查询10条,然后将这10条更新成1不就可以了。 这个方法完全是可以的,而且也没有什么不好,也很简单。是通过数据库的事务来控制的。 还有一种方法,用一台专用服务器来进行任务的分发,其他服务器进行任务的执行。
ivan_070 2014-09-13
  • 打赏
  • 举报
回复
我有一个解决办法,感觉不是太好。 每个线程都查询出10条status为0的记录, 遍历每一条,select * from task where id=xxx for update 如果查询出来status是0,则update为1,返回。 请问还有没有比较好的办法。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧