Erlang 如何睡觉(晚上?)

2024-05-16

我想在 Erlang 服务器上每隔几个小时运行一次小型清理过程。

我知道计时器模块。我在教程中看到一个示例,使用链式计时器:睡眠命令来等待几天后发生的事件,我觉得这很奇怪。我知道 Erlang 进程与其他语言中的进程相比是独一无二的,但是进程/线程一次休眠数天、数周甚至数月的想法似乎很奇怪。

因此,我开始了解睡眠的具体作用。我发现的最接近的是一篇博客文章,提到睡眠是通过接收超时实现的,但这仍然留下了问题:

这些睡眠/类似睡眠的功能实际上有什么作用?

我的进程在休眠时是否占用资源?数千个休眠进程会使用同样多的资源吗?例如,数千个进程为不执行任何操作的递归调用提供服务?在进程内反复休眠或长时间休眠是否会造成性能损失? VM是否不断消耗资源来查看结束进程睡眠的条件是否成立?

作为旁注,如果有人能评论一下是否有比睡觉更好的方法,一次暂停几个小时或几天,我将不胜感激。


这就是任何 erlang 进程的业力:它等待或死亡:o)

当一个进程产生时,它开始执行直到最后一个执行行,然后死亡,返回最后一个评估。

为了使进程保持活动状态,没有其他解决方案可以在永无休止的连续调用中递归循环。

当然有几个条件让它停止或者休眠:

  • 循环结束:进程收到一条消息,告诉他 停止递归
  • 接收块:进程将等待消息 与接收块中的一项匹配的条目将发布在消息中 队列。
  • VM调度程序暂时停止它以允许访问CPU 到其他进程

在最后两种情况下,执行将在 VM 调度程序的负责下重新启动。

等待时,它不使用 CPU 带宽,但会保持与开始等待时完全相同的内存布局。 Erlang OTP 提供了一些方法,使用 hibernate 选项将内存布局减少到最小(请参阅 gen_serevr 或 gen_fsm 的文档,但在我看来,它仅用于高级用途)。

创建一个以规则(或几乎规则)间隔触发进程的“信号”的简单方法是有效地使用带有超时的接收块(超时限制为 65535 毫秒),例如:

on_tick_sec(Module,Function,Arglist,Period) -> 
    on_tick(Module,Function,Arglist,1000,Period,0).
on_tick_mn(Module,Function,Arglist,Period) -> 
    on_tick(Module,Function,Arglist,60000,Period,0).
on_tick_hr(Module,Function,Arglist,Period) -> 
    on_tick(Module,Function,Arglist,60000,Period*60,0).



on_tick(Module,Function,Arglist,TimeBase,Period,Period) ->
    apply(Module,Function,Arglist),
    on_tick(Module,Function,Arglist,TimeBase,Period,0);
on_tick(Module,Function,Arglist,TimeBase,Period,CountTimeBase) ->
    receive
        stop -> stopped
    after TimeBase ->
        on_tick(Module,Function,Arglist,TimeBase,Period,CountTimeBase+1)
    end.

和用法:

1> Pid = spawn(util,on_tick_sec,[io,format,["hello~n"],5]).
<0.40.0>
hello                
hello                
hello                
hello                        
2> Pid ! stop.
stop
3>

[edit]

计时器模块是一个在单独进程中运行的标准 gen_server。定时器模块中的所有函数都是公共接口,它们执行隐藏的 gen_server:call 或 gen_server:cast 到定时器服务器。这是隐藏服务器内部并允许进一步发展而不影响现有应用程序的常见用法。

服务器在内部使用一个表(ets)来存储它必须执行的所有操作以及每个计时器引用,并且它使用自己的函数在需要时被唤醒(最后,VM 必须处理这个?)。

因此,您可以休眠进程,而不会对计时器服务器行为产生任何影响。休眠机制是

  • 棘手,请参阅文档hibernate/3 定义 http://www.erlang.org/doc/man/erlang.html#hibernate-3,您将看到您必须自己“重建”上下文,因为所有内容都已从流程上下文中删除,并且系统存储了一个元组(模块,函数,参数}以在需要时重新启动您的流程。
  • 花费一些时间进行垃圾收集和进程重启

这就是为什么我说它确实是一个高级功能,需要充分的理由才能使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Erlang 如何睡觉(晚上?) 的相关文章

  • 在后台线程上搜索

    我试图在 iPhone 应用程序中搜索数千个对象 但是搜索严重滞后 每次击键后 UI 都会冻结 1 2 秒 为了防止这种情况 我必须在后台线程上执行搜索 我想知道是否有人有一些在后台线程上搜索的提示 我读了一点NSOperation并在网上
  • JFrame 在连续运行代码时冻结

    我在使用时遇到问题JFrame 它会冻结 连续运行代码 下面是我的代码 点击时btnRun 我调用了该函数MainLoop ActionListener btnRun Click new ActionListener Override pu
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 线程数组?

    所以我在理解如何避免线程的顺序执行时遇到了问题 我试图创建一个线程数组并在单独的循环中执行 start 和 join 函数 这是我现在拥有的代码示例 private static int w static class wThreads im
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • Boost:如何创建一个线程以便可以控制它的所有标准输出、标准错误?

    我用 C 创建了一个 win32 控制台应用程序 我使用一些API 不是我的 我不能修改它的来源 它是这样写的 它会将一些信息写入控制台屏幕 而不询问 每次我调用它时 每秒 48 次 所以我想将它放入某个线程并限制其输出能力 但我需要得到当
  • C++11 非阻塞生产者/消费者

    我有一个 C 11 应用程序 其中有一个生成数据的高优先级线程和一个消耗数据的低优先级线程 在我的例子中 将其写入磁盘 我想确保高优先级生产者线程永远不会被阻塞 即它仅使用无锁算法 使用无锁队列 我可以从生产者线程将数据推送到队列 并从消费
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 初始化 ConcurrentHashMap 值的最快方法

    ConcurrentHashMap 通常在并发环境中用于聚合某个键下的某些事件 例如计算某些字符串值的命中数 如果我们事先不知道密钥 我们需要有一个好的方法来根据需要初始化密钥 它应该在并发性方面快速且安全 这个问题的最佳模式 就效率而言
  • 以不可见模式运行主bat文件

    我有一个大师 bat文件有 call file1 bat call file2 bat call file3 bat call file4 bat 我想在我的 Windows Server 2008 上安排它以静默 不可见模式运行 我正在寻
  • 检测您何时进入/退出 Xamarin.iOS 中的主线程

    Xamarin MonoTouch 有没有办法检测主线程中是否正在调用代码 我正在寻找类似于Java的东西EventQueue isEventDispatchThread 我发现 Swing 编程很方便assert时不时 或有时assert
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • 多线程环境中的析构函数?

    我想知道在这样的课堂上会发生什么 class MyClass private std vector
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • 使用 volatile bool 强制另一个线程等待是否安全? (C++)

    我读到的有关 volatile 的所有内容都说它永远不安全 但我仍然倾向于尝试它 而且我还没有看到这种特定场景被宣布为不安全 我有一个单独的线程来渲染场景 从主模拟线程中提取数据 这没有同步 并且工作正常 问题是 当程序退出时 渲染器需要停
  • iPhone SDK - 在后台线程中运行重复进程

    我有一个iPhone我想在其中每隔一段时间在后台执行一个方法的应用程序1第二 所以在我的主线程中 我有以下代码UIViewController viewDidLoad NSTimer timerWithTimeInterval 1 0 ta
  • 未定义的命名空间“提升”

    我正在尝试一个 C 小线程程序 但出现错误 我无法处理它 The Code include Threads h include Interthread h void task1 void arg do stuff void task2 do
  • 如何在单击按钮时清除反应挂钩中的间隔

    我正在用反应钩子构建一个简单的计时器 我有两个按钮启动和重置 当我单击开始按钮时 handleStart 函数工作正常 计时器启动 但我不知道如何在单击重置按钮时重置计时器 这是我的代码 const App gt const timer s
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变

随机推荐