如何使长时间运行的事务在Clojure中快速失败

杰森

假设下面的代码中的ref在其他事务以及下面的事务中都被修改,则我担心的是,该事务将一直运行到提交,提交失败,然后重新运行该事务为止。

(defn modify-ref [my-ref]
  (dosync (if (some-prop-of-ref-true @my-ref)
            (alter my-ref long-running-calculation))))

这是我的全部恐惧:

  1. 调用Modify-ref,启动一个事务(称为A),并开始长时间运行的计算
  2. 另一个事务(称为B)开始,修改my-ref,然后返回(成功提交)
  3. 长时间运行的计算将一直持续到完成为止
  4. 事务A尝试提交但由于my-ref已被修改而失败
  5. 使用my-ref的新值重新启动事务(称为A')并退出,因为some-prop不为true

这就是我想发生的事情,也许这就是发生的事情(我只是不知道,所以我要问一个问题:-)

当事务B提交my-ref时,我希望事务A立即停止(因为my-ref的值已更改)并使用新值重新启动。那会发生什么吗?

我想要这种行为的原因是,长时间运行的计算不会浪费所有CPU时间在现在已过时的计算上。

我曾考虑过使用ensure,但不知道如何在这种情况下或是否有必要使用它。

丹·勒布雷罗

它像您担心的那样工作。

停止JVM中的线程做任何事情都需要协作,因此Clojure(或任何其他JVM语言)没有通用的方法来停止正在运行的计算。计算必须定期检查信号以查看其是否应自行停止。请参阅如何杀死Java中的线程?

关于如何实现它,我会说太难了,因此我首先要衡量它是否真的是一个问题。如果是这样,我会看看传统的悲观锁是否是更好的解决方案。如果悲观锁仍然不是解决方案,我将尝试构建一些在事务外部运行计算的东西,在refs上使用观察程序,并在计算后有条件地设置refs(如果它们仍然具有相同的值)。当然,这超出了交易范围,听起来可能要棘手得多。

关于ensure,只有被修改的ref才能参与事务,因此您可能会因写入歪斜而受苦有关详细说明,请参见Clojure STM模糊度因子

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在PowerShell中停止长时间运行的cmdlet

来自分类Dev

在Go中,如何关闭长时间运行的阅读?

来自分类Dev

如何在mysql中优化长时间运行的查询

来自分类Dev

在Javaee中处理长时间运行的作业时发生超时事务

来自分类Dev

如何在Python中在后台运行长时间运行的作业

来自分类Dev

在Rails中运行大量长时间运行的后台作业

来自分类Dev

如何在Perl中处理AnyEvent,RabbitMQ(心跳)和长时间运行的作业?

来自分类常见问题

如何在自定义长时间运行的计时器作业中设置进度

来自分类Dev

如何使用子进程和Popen从长时间运行的进程中返回stdout?

来自分类Dev

如何在我的Android应用中管理长时间运行的单例

来自分类Dev

如何在Node JS中执行/中止长时间运行的任务?

来自分类Dev

如何在Eclipse Vert.x中执行长时间运行/轮询操作

来自分类Dev

Blazor WebAssembly:如何在长时间运行的非异步过程中更新UI

来自分类Dev

如何在自定义长时间运行的计时器作业中设置进度

来自分类Dev

EF 5:如何在异步任务中取消长时间运行的查询

来自分类Dev

长时间运行的线程如何在Web应用程序中工作

来自分类Dev

如何使用子进程和Popen从长时间运行的进程中返回stdout?

来自分类Dev

如何在长时间运行的脚本中“触摸” php会话

来自分类Dev

如何确保在WPF应用程序中长时间运行的过程中更新了UI?

来自分类Dev

sshj:如何在执行命令时从长时间运行的命令中读取InputStream

来自分类Dev

如何取消可以多次取消的长时间运行的操作?

来自分类Dev

如何识别活动(长时间运行)HTTP请求的URI?

来自分类Dev

如何使用TPL处理长时间运行的过程

来自分类Dev

如何跟踪长时间运行的IIS调用?

来自分类Dev

如何转储长时间运行的结果?

来自分类Dev

如何使用实体框架处理长时间运行的操作?

来自分类Dev

多次调用长时间运行的函数时,如何停止?

来自分类Dev

如何防止长时间运行时冻结

来自分类Dev

您如何调试长时间运行的php脚本?

Related 相关文章

  1. 1

    如何在PowerShell中停止长时间运行的cmdlet

  2. 2

    在Go中,如何关闭长时间运行的阅读?

  3. 3

    如何在mysql中优化长时间运行的查询

  4. 4

    在Javaee中处理长时间运行的作业时发生超时事务

  5. 5

    如何在Python中在后台运行长时间运行的作业

  6. 6

    在Rails中运行大量长时间运行的后台作业

  7. 7

    如何在Perl中处理AnyEvent,RabbitMQ(心跳)和长时间运行的作业?

  8. 8

    如何在自定义长时间运行的计时器作业中设置进度

  9. 9

    如何使用子进程和Popen从长时间运行的进程中返回stdout?

  10. 10

    如何在我的Android应用中管理长时间运行的单例

  11. 11

    如何在Node JS中执行/中止长时间运行的任务?

  12. 12

    如何在Eclipse Vert.x中执行长时间运行/轮询操作

  13. 13

    Blazor WebAssembly:如何在长时间运行的非异步过程中更新UI

  14. 14

    如何在自定义长时间运行的计时器作业中设置进度

  15. 15

    EF 5:如何在异步任务中取消长时间运行的查询

  16. 16

    长时间运行的线程如何在Web应用程序中工作

  17. 17

    如何使用子进程和Popen从长时间运行的进程中返回stdout?

  18. 18

    如何在长时间运行的脚本中“触摸” php会话

  19. 19

    如何确保在WPF应用程序中长时间运行的过程中更新了UI?

  20. 20

    sshj:如何在执行命令时从长时间运行的命令中读取InputStream

  21. 21

    如何取消可以多次取消的长时间运行的操作?

  22. 22

    如何识别活动(长时间运行)HTTP请求的URI?

  23. 23

    如何使用TPL处理长时间运行的过程

  24. 24

    如何跟踪长时间运行的IIS调用?

  25. 25

    如何转储长时间运行的结果?

  26. 26

    如何使用实体框架处理长时间运行的操作?

  27. 27

    多次调用长时间运行的函数时,如何停止?

  28. 28

    如何防止长时间运行时冻结

  29. 29

    您如何调试长时间运行的php脚本?

热门标签

归档