Erlang 生成的Elixir进程崩溃后,不会生成其他进程
在我的程序中,在读取CSV文件中的每一行之后,将生成一个新进程来下载该图像并将其保存到文件系统: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
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
在向初始进程发回消息之前崩溃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
我已经是异步的,但我不是。谢谢