如果我有一个可以在没有任何依赖关系的情况下异步执行的函数并且没有其他函数直接需要它的结果,我应该使用 spawn 吗?在我的场景中,我想继续使用消息队列,因此生成会重新定义我的阻塞循环,但是如果在其他情况下我可以尽可能多地分发函数调用,这会对我的应用程序产生负面影响吗?
总的来说,使用 Spawn 的优缺点是什么。
如果我有一个可以在没有任何依赖关系的情况下异步执行的函数并且没有其他函数直接需要它的结果,我应该使用 spawn 吗?在我的场景中,我想继续使用消息队列,因此生成会重新定义我的阻塞循环,但是如果在其他情况下我可以尽可能多地分发函数调用,这会对我的应用程序产生负面影响吗?
总的来说,使用 Spawn 的优缺点是什么。
与操作系统进程或线程不同,Erlang 进程的重量非常轻。启动、停止和调度新进程的开销最小。您应该能够根据需要生成尽可能多的它们(每个 vm 的最大值为数十万)。Erlang 实现的 Actor 模型允许您考虑并行实际发生的事情并编写程序来直接表达。如果可以避免,请避免使用工作队列使您的逻辑复杂化。
只要符合逻辑就生成一个流程,并仅在必要时进行优化。
首先想到的是参数的大小。它们将从您当前的流程复制到新流程,如果参数很大,则可能效率低下。
另一个可能出现的问题是,虚拟机的进程数量如此之多,以至于您的系统将变得无响应。您可以通过使用工作进程池或特殊监控进程来解决此问题,这些进程仅允许有限数量的此类进程工作。
所以产卵会减轻我的阻塞循环
如果您处于循环将收到许多需要独立操作的消息的情况,请不要犹豫并为每个消息处理生成新进程,这样您将利用计算机的多核功能(如果有)。正如 kjw0188 所说,Erlang 进程的重量非常轻,如果系统达到并行进程数的限制(假设您正在执行合理的代码),则应用程序更有可能使节点的能力过载。