Erlang 生成的Elixir进程崩溃后,不会生成其他进程

Erlang 生成的Elixir进程崩溃后,不会生成其他进程,erlang,elixir,Erlang,Elixir,在我的程序中,在读取CSV文件中的每一行之后,将生成一个新进程来下载该图像并将其保存到文件系统: defmodule Downloader.CLI do 别名下载程序 别名下载器 def main(_args\\[])do Enum.map(Parser.run,fn(行)-> 行->句柄下载(行) (完) 结束 defp handle_download({:ok,%%{“image_id”=>image_id})do pid=spawn(Getter,:run,[]) 发送(pid,{self

在我的程序中,在读取CSV文件中的每一行之后,将生成一个新进程来下载该图像并将其保存到文件系统:

defmodule Downloader.CLI do
别名下载程序
别名下载器
def main(_args\\[])do
Enum.map(Parser.run,fn(行)->
行->句柄下载(行)
(完)
结束
defp handle_download({:ok,%%{“image_id”=>image_id})do
pid=spawn(Getter,:run,[])
发送(pid,{self(),image_id})
接收do
:确定->无
错误->IO.inspect(错误)
结束
结束
结束
如果此CSV文件有1000个图像,则会在VM中创建1000个不同的elixir进程。但是,如果这些进程中只有一个抛出异常,则其他进程不会继续。也就是说,可执行文件不会冻结,但不会下载其他图像


为什么会发生这种情况?如果其他进程彼此独立,为什么它们不能继续执行?我想错过一些简单的东西,但我就是在其他地方找不到。

问题:接收do等待一条永远不会到来的消息

这是一步一步发生的:

  • spawn
    创建进程
    pid
  • 进程
    pid
    在向初始进程发回消息之前崩溃
  • 初始进程卡在接收函数中:它等待消息。只要不发送任何消息,一切都将暂停<代码>枚举.map下载后将不会启动
  • 要说明此问题,请在iex中运行以下脚本:

    Process.send_之后(self(),“Hi Luis”,30000)
    接收do
    mess->IO.inspect mess
    结束
    
    您将仅在30秒后收到“Hi Luis”,并且在这30秒期间,您的iex将等待消息,因为它是同步的

    解决方案:确保始终发送回消息,例如使用
    Process.monitor/1
    Supervisor

    defmodule Downloader.CLI do
    别名下载程序
    别名下载器
    def main(_args\\[])do
    Enum.map(Parser.run,fn(行)->
    行->句柄下载(行)
    (完)
    结束
    defp handle_download({:ok,%%{“image_id”=>image_id})do
    pid=spawn(Getter,:run,[])
    过程监视器(pid)
    发送(pid,{self(),image_id})
    接收do
    :确定->无
    错误->IO.inspect(错误)
    结束
    刷新#以避免下次下载时出现停机消息提前结束
    结束
    结束
    
    这是遗漏的一点!我认为仅仅通过使用
    spwan
    我已经是异步的,但我不是。谢谢