这不是一个纯粹的'功能性问题,因为它涉及副作用。我有一个功能,可能需要10秒,比如完成。该函数在数据库中生成数据(例如)。如果它同时运行两次,它将创建重复数据。假设可以通过单击浏览器中的按钮来触发该功能。如果两个人在几秒钟内相互点击,那么该功能可以同时运行两次。
在Java和类似的系统中,我会在信号量上使用同步。在Node或Django中,我可以利用单线程来删除并行运行。
running = False
def long_running_process():
global running
# only run once
if running: return
try:
running = True
.... go to it ...
finally:
running = False
Python中对全局引用的要求清楚地暗示了这个函数需要状态 - 因此本质上是必要的。
所以,对我的问题。
我已经知道Haskell的人会告诉我创建一个Monad状态,但是Clojure或Elixir会怎么处理呢?