JavaScript工作队列

拥抱

我创建了一个包含数组的对象,该数组用作工作队列。

这样的工作是这样的:

var work1 = new Work();
var work2 = new Work();
var queue = Workqueue.instance();

queue.add(work1) // Bluebird promise.
.then(function addWork2() {
  return queue.add(work2);
})
.then(function toCommit() {
  return queue.commit();
})
.then(function done(results) {
  // obtain results here.
})
.catch(function(err){});

在这种情况下它可以工作,在我调用提交之前,我可以提交多个任务。

但是,如果是这样的话:

var work1 = new Work();
var work2 = new Work();
var queue = Workqueue.instance();

queue.add(work1)
.then(function toCommit1() {
  return queue.commit();
})
.then(function done1(result1) {
  // obtain result1 here.
})
.catch(function(err){});

queue.add(work2)
.then(function toCommit2() {
  return queue.commit();
})
.then(function done2(result2) {
  // obtain result2 here.
})
.catch(function(err){});

可能出问题了,因为如果在第二次提交之后调用了第一次提交(已经添加了两个工作/任务),则第一个提交处理程序将期望结果,但是它们都进入了第二个提交处理程序。

该任务涉及Web SQL数据库读取,还可能涉及网络访问。因此,这基本上是一个复杂的过程,因此上述问题可能会浮出水面。如果只有我可以addWorkAndCommit()实现将add包裹commit在一起的实现,但是仍然不能保证,因为addWorkAndCommit()从某种意义上说它们是“原子的”,因为它们涉及异步调用。因此,即使有两个呼叫,addWorkAndCommit()也可能失败。(由于JavaScript是单线程的,所以我不知道用“原子”来描述它,但是这个问题冒出来了)。

我能做些什么?

lex82

问题在于commit()没有事务的概念,但是没有事务的概念,因此您不能明确地使两个独立的事务并行运行。根据我的理解,JavaScriptWorkqueue是远程队列的代理,add()并且commit()直接调用映射到某种具有类似接口但没有事务的远程过程调用。我也了解您不会关心第二个是否add()真的发生在第一个之后commit(),您只想编写两个简单的后续addWorkAndCommit()语句,而无需在客户端代码中同步基础调用。

您可以做的是在本地周围编写一个包装器Workqueue(如果是您的代码,则直接对其进行更改),这样队列的每次更新都会创建一个新事务,并且commit()始终引用一个这样的事务。然后,包装程序将延迟新的更新,直到所有先前的事务都被提交(或回滚)为止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

KTA工作队列查询

来自分类Dev

在ExecutorService的newFixedThreadPool()中工作队列?

来自分类Dev

迟钝的工作队列设计模式?

来自分类Dev

动态小任务或工作队列

来自分类Dev

使工作队列和RPC协同工作

来自分类常见问题

Kafka可以用作分发工作队列

来自分类Dev

未绑定工作队列的kthreads CPU关联性

来自分类Dev

可排序的工作队列软件或设计模式

来自分类Dev

RabbitMQ中Pub / Sub与工作队列的混合

来自分类Dev

工作队列:__WORK_INITIALIZER编译器警告

来自分类Dev

如何创建基于任务/ TPL的工作队列/事件循环?

来自分类Dev

Linux内核模块:延迟的工作队列使内核崩溃

来自分类Dev

Nuttx:为什么工作队列线程需要轮询?

来自分类Dev

MassTransit 可以用于工作队列场景吗?

来自分类Dev

无法运行与关联的 WC DB 工作队列

来自分类Dev

如何在 SwiftNIO 中使用工作队列?

来自分类Dev

为每天1000万以上的工作队列扩展工作人员

来自分类Dev

在编译时VS运行时初始化链表或工作队列

来自分类Dev

使用CUDA原子操作和网格同步处理共享工作队列

来自分类Dev

读取时工作队列和计时器模块崩溃

来自分类Dev

在编译时VS运行时初始化链表或工作队列

来自分类Dev

我们可以从工作队列中调用enable_irq()吗?

来自分类Dev

如何将NAPI轮询功能卸载到工作队列

来自分类Dev

工作队列:1不允许加载本地资源:file:///

来自分类Dev

通过工作队列调用 aio_complete 时的内核 Oops

来自分类Dev

工作队列开始、中断和从未完成导致 CPU 停顿

来自分类Dev

如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用

来自分类Dev

如何将工作队列修补程序转换为工作副本中未完成的更改?

来自分类Dev

线程队列工作示例

Related 相关文章

  1. 1

    KTA工作队列查询

  2. 2

    在ExecutorService的newFixedThreadPool()中工作队列?

  3. 3

    迟钝的工作队列设计模式?

  4. 4

    动态小任务或工作队列

  5. 5

    使工作队列和RPC协同工作

  6. 6

    Kafka可以用作分发工作队列

  7. 7

    未绑定工作队列的kthreads CPU关联性

  8. 8

    可排序的工作队列软件或设计模式

  9. 9

    RabbitMQ中Pub / Sub与工作队列的混合

  10. 10

    工作队列:__WORK_INITIALIZER编译器警告

  11. 11

    如何创建基于任务/ TPL的工作队列/事件循环?

  12. 12

    Linux内核模块:延迟的工作队列使内核崩溃

  13. 13

    Nuttx:为什么工作队列线程需要轮询?

  14. 14

    MassTransit 可以用于工作队列场景吗?

  15. 15

    无法运行与关联的 WC DB 工作队列

  16. 16

    如何在 SwiftNIO 中使用工作队列?

  17. 17

    为每天1000万以上的工作队列扩展工作人员

  18. 18

    在编译时VS运行时初始化链表或工作队列

  19. 19

    使用CUDA原子操作和网格同步处理共享工作队列

  20. 20

    读取时工作队列和计时器模块崩溃

  21. 21

    在编译时VS运行时初始化链表或工作队列

  22. 22

    我们可以从工作队列中调用enable_irq()吗?

  23. 23

    如何将NAPI轮询功能卸载到工作队列

  24. 24

    工作队列:1不允许加载本地资源:file:///

  25. 25

    通过工作队列调用 aio_complete 时的内核 Oops

  26. 26

    工作队列开始、中断和从未完成导致 CPU 停顿

  27. 27

    如何将 IAudioClient3 (WASAPI) 与实时工作队列 API 结合使用

  28. 28

    如何将工作队列修补程序转换为工作副本中未完成的更改?

  29. 29

    线程队列工作示例

热门标签

归档