如何实现这一点:函数执行后,所有内容都会恢复到调用它之前的状态。可以用fork来实现吗?

问题描述 投票:0回答:1

我发现自己偶尔需要执行函数的“探测”版本。

举一个简单的例子,在开发评估器时,我可能想做一个尝试性的评估,看看当前的依赖信息是否足够。在这种情况下,我将调用 eval 函数,就好像它是一个探针一样,即,我只关心它的返回值 bool ,表示成功/失败。最重要的是,由于这只是一个尝试性的尝试,我希望在整个执行过程中保持所有内容完好无损,换句话说,在探测之前和之后,诸如依赖性/计数器/备忘录/等的数据不会有所不同。

现在,如果探测函数足够简单,我当然可以创建一个模仿旧函数的新函数,除了每个写操作都是在深度复制上进行,等等。

但是,如果函数有几千行代码,而且逻辑如此交织在一起。写一个新的已经不再实用了。我只能依靠回归系统来帮助识别尽可能多的问题并承担潜在的风险。

因此我想知道

  • 有没有明确的方法来实现这一目标?
  • Linux上可以用fork来实现吗?也就是说,父进程只是等待子进程,子进程什么也不做,子进程执行探测功能并通过管道将目标值传递给父进程。如果我的内存没有生锈得那么严重,fork 使用写时复制方案,因此它类似于上面讨论的流程,并且我预计开销相对较低。这样做有什么危险吗?

编辑:

各位同学,我还在这里期待大家的意见和指教。我注意到有一些投票来结束这个问题,如果我要求的功能看起来不合理,我想在这里了解为什么,是我的设计模式在某个地方如此错误,以至于我不得不做这种不必要的尝试吗?有什么办法可以避免这条路吗?还是我误解或错过了什么?

另外,我突然想到,有些函数也可能有socket连接,比如说评估器的例子,建立了一个Redis连接,会记录不同用户的写作风格,比如说,有多少比例的用户写RPN(反向波兰表示法) )等,帮助进一步优化。我认为分叉方案无法处理这个问题。但我们忽略并假设不涉及网络套接字:)

python c++ operating-system fork deep-copy
1个回答
0
投票

您可以尝试将“函数”编写为对象方法,并进行适当的封装。

然后:

  • 有一个 const 'probe' 方法,它执行评估并返回 bool (或抛出) - 无需修改实例
  • 或者使对象可克隆/可复制。要探测,请复制它,调用该方法,然后删除副本。

使用 fork() 来做到这一点可能是一个非常糟糕的主意,除非你真的知道你在做什么并且绝对没有其他解决方案。

如果你确实有套接字连接,并且探针接触到它们,你不能保证没有副作用(除非你所有的套接字访问都是幂等的),所以它可能是不可行的。

抱歉,我无法更准确,因为您的问题很模糊......

© www.soinside.com 2019 - 2024. All rights reserved.