我的内部有一个容器在运行请求者,我想知道是否可以向该容器发送一个HTTP请求,以便以某种方式停止当前正在运行的任务。在雅格纳或雅皮有什么内置的方法可以让我这样做吗?
发布于 2021-12-30 03:29:46
问得好!假设您是指在Golem execute_tasks调用中启动的单个任务或一组任务,则答案是No,您不能使用REST直接完全取消任务。(证明我错了!,最后看看我吧)
但是,通过REST!终止其关联协议,可以间接取消(但随后重试)任务,前提是您可以发现(可能是通过REST以外的其他方式)任务的关联协议id。
终止取消和重试任务的协议可以通过POST http方法完成。下面我举一个例子。
使用此引用可以查看可用的端点并自己确认:
如果您想要查看如何破解取消并重试的示例,则只能继续阅读。
pre:容器在192.168.1.100上运行,yagna守护进程在7465端口上运行
使这项工作成功的关键是发现任务的一致性id。在这里,我将展示如何通过监视请求者脚本中的事件间接地获得协议id。替代方法可能包括监视yagna守护进程日志文件中的新活动和解析关联的活动id。
鉴于每个任务都是双向地与协议id相关联的,我将描述如何终止特定的协议,从而取消并使用所述id一次重试它的任务。
下面是如何通过终止任务协议来取消(并重试)特定任务,可以在任务模型的上下文中使用curl来完成,例如在bash脚本中。
#!/bin/sh
# terminate_agreement.sh
# YAGNA_APPKEY is set in the environment
AGREEMENT_ID=$1
IPADDR_CONTAINER=192.168.1.100
curl http://$IPADDR_CONTAINER:7465/market-api/v1/agreements/$AGREEMENT_ID/terminate?timeout=300 -H "Authorization: Bearer $YAGNA_APPKEY" -H 'Content-Type:application/json' -d '{"message": "into the void!"}' # -X POST implied这将引发的异常,许多类型的取决于任务在其执行的worker函数中的生命周期阶段(回调作为golem.execute_tasks的第一个参数)。由于异常类型繁多,因此很难具体处理。也就是说,在例外情况下,可以将Task对象与其协议id联系起来;然后,我们可以检查协议的状态--对于任何例外的一般情况,都必须这样做。但是,给定当前Task类属性,区分异常并识别运行中的任务是否被远程取消是当前api imho的一个小问题。
示例运行:
$ terminate_agreement.sh 5bb68e8bc8cd726ef9ecb45395e6c0797dcadf4ff5c2d049c9c1a82ccebfe4f7
# will respond with 200 for OK and this will show up in the yagna daemon log as:
[2021-12-29T19:09:55.882-0800 INFO ya_market::negotiation::common] Requestor 'original' [0xb9cee14d2f31b4fd551ef041f81359084ce0d3a7] terminated Agreement [R-5bb68e8bc8cd726ef9ecb45395e6c0797dcadf4ff5c2d049c9c1a82ccebfe4f7]. Reason: 'into the void!'发现协议is并将其与任务关联的一种方法是对yapapi.log.SummaryLogger进行子类化,并重写日志,如下所示:
# inside class definition of base class SummaryLogger
def log(self, event: yapapi.events.Event) -> None:
if isinstance(event, yapapi.events.AgreementCreated):
print(f"{event.provider_info.name} is working on a task with agreement id of: {event.agr_id}", file=sys.stderr)但是要使这个工作(远程),一个单独的程序将需要监视这些广播信息(例如通过IPC,套接字等)。我刚把它打印给史泰尔。然而,这并不能解决在脚本上下文中区分一个正在运行的任务与另一个任务的问题.
参考资料:
,我预计将来会有更多的端点和方便功能,以及文档,以便于远程取消一个或多个任务!
关于雅格纳:
yagna代表的是另一个网络代理。它是一个守护进程,它为计算和服务的分布提供了动力,这些cpus的数量是无限的,这些cpus充当着golem网络上的节点。在https://www.golem.network学习如何利用这一创新模式或从中获利
关于我:
嗨,我是krunch3r,我是一个面向过程的人,因此,我不断地编辑,因为我证明自己错了,并鼓励别人证明我的任何观察错误!如果你这么做了,请礼貌点。也就是说,其他人可能希望描述如何通过REST本身来发现协议ids,例如从REST响应中远程从守护进程获取相关的事件信息。在这种情况下,答案会更一般化一些;不过,仍然需要标识id。
https://stackoverflow.com/questions/70421902
复制相似问题