Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 使用长生不老药和凤凰的背景流程_Elixir_Phoenix Framework_Background Process - Fatal编程技术网

Elixir 使用长生不老药和凤凰的背景流程

Elixir 使用长生不老药和凤凰的背景流程,elixir,phoenix-framework,background-process,Elixir,Phoenix Framework,Background Process,我有一个系统,可以创建一个问题并将这个问题插入数据库,我可以通过单击我设置的链接来完成。这是很简单的事情。创建控制器操作设置其链接,然后单击按钮启动该操作 这项措施目前有效。但是下一个阶段是让系统创建一个问题,而不需要用户界面的任何干预。所以,这就把我带到了一个有长生不老药/凤凰的新地方。我的新问题是:我需要在一天的x时间自动运行这个函数 问题: 在Elixir/Phoenix中实现后台任务最惯用的方式是什么?我对Genserver或Supervisors知之甚少,但我想我已经准备好开始学习这些

我有一个系统,可以创建一个问题并将这个问题插入数据库,我可以通过单击我设置的链接来完成。这是很简单的事情。创建控制器操作设置其链接,然后单击按钮启动该操作

这项措施目前有效。但是下一个阶段是让系统创建一个问题,而不需要用户界面的任何干预。所以,这就把我带到了一个有长生不老药/凤凰的新地方。我的新问题是:我需要在一天的x时间自动运行这个函数

问题: 在Elixir/Phoenix中实现后台任务最惯用的方式是什么?我对Genserver或Supervisors知之甚少,但我想我已经准备好开始学习这些工具了。话虽如此,您如何处理将逻辑转移到后台工作的问题

代码: 此控制器操作由链接触发。此代码需要在后台调用。提前感谢您的帮助。

您没有多少选择

一种是在您的操作中简单地运行Task.async,但它将执行您的操作的进程和生成的进程链接起来,所以任务崩溃将影响生成它并等待它的进程。顺便说一句,在你的特殊情况下,我认为你不希望在你的行动中出现这种情况,因为在等待结果的过程中你没有任何东西可以处理,所以这是不必要的

第二种选择是使用Task.start\u链接,以防您不想等待结果。这是可以的,但正如start函数的名称一样,tasks进程也链接到您的进程,所以这两个进程中的任何一个崩溃都会导致其他进程崩溃

第三个选项是使用Task.Supervisor,只需打开你的app-ex文件,可能是一个在项目中有名称的文件,它位于lib文件夹中,在children=[…list add下面,如下所示

children = [
    ...
    supervisor(Task.Supervisor,[], [name: MyApp.TaskSupervisor])
]
这将在您的应用程序中启动名为MyApp.TaskSupervisor的supervisor进程,您可以调用该进程并告诉运行和监督它的代码

现在,第三个选项为您的应用程序提供了更多的控制,因为:

您可以在后台运行task async,而无需将指示主管任务应该做什么的流程和任务流程链接起来,相反,主管将监视此任务 你仍然可以等待结果 如果希望在任务崩溃时进程崩溃,您仍然可以链接任务 您可以轻松地将事件分发到其他节点。
你可以在

中找到更多关于这方面的信息,将用户重定向到其他页面的代码不能异步运行。明白了。所以,这是需要更改的。但是我如何运行问题。在后台创建问题?或者?啊,很有趣。我想这些可以满足我的需要。
children = [
    ...
    supervisor(Task.Supervisor,[], [name: MyApp.TaskSupervisor])
]