gpt4 book ai didi

elixir - 如何在没有测试警告的情况下从 Controller 运行 "fire and forget"任务?

转载 作者:行者123 更新时间:2023-12-05 00:15:04 27 4
gpt4 key购买 nike

在我的 Phoenix 应用程序中,我有一个模块函数,如 Reviews.create(attributes) .它会立即做一些工作,并启动一个任务(使用 Task.async )来做额外的工作。

我可以像这样测试它:

{:ok, new_review, task} = Reviews.create(attrs)
# verify that new_review is correct
Task.await(task)
# verify that the task did what it should

但是,我想使用的主要地方 Reviews.create/1来自 Controller 。从那里开始,我想将任务视为“一劳永逸”。这很简单:我只是不调用 Task.await .

这工作正常,除了当我测试 Controller 时,我得到如下错误:
[error] Postgrex.Protocol (#PID<0.344.0>) disconnected: ** 
(DBConnection.ConnectionError) owner #PID<0.753.0> exited
while client #PID<0.755.0> is still running with: shutdown

换句话说,它告诉我当 Controller 测试结束时任务被杀死了。我不在乎。

有没有办法让这更明确地“一劳永逸”?例如,如果我可以从 Controller 调用 Task.forget_about(task),那就太好了。 ,但那不存在。

最佳答案

您将需要使用 Task.start/1 反而。它基本上以相同的方式运行,它只是在不同的进程中运行您的函数,但它不会以任何方式链接到产生它的进程。

直接来自文档

This is only used when the task is used for side-effects (i.e. no interest in the returned result) and it should not be linked to the current process.

关于elixir - 如何在没有测试警告的情况下从 Controller 运行 "fire and forget"任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45592956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com