新傀儡的高级Python API

yapapi的Python项目详细描述


傀儡Python API

Tests - StatusPyPI - StatusPyPI versionGitHub licenseGitHub issues

什么是傀儡,顺便说一句?在

Golem是一个全球性的、开源的、分散的超级计算机 任何人都可以访问。它连接个人电脑-笔记本电脑、家用电脑或 甚至数据中心-形成一个庞大的网络,其目的是提供一种 将计算分发到其提供者节点,并允许请求者利用其唯一的 潜力在于它的综合计算能力,地理分布 或是对审查制度的抵制。在

傀儡的请求者设置

傀儡的请求端配置由两个独立的组件组成:

  • 中的^{} daemon-您的节点 新的傀儡网络,负责与其他节点通信,运行 市场和提供方便的支付机制。在
  • 请求者代理-特定傀儡应用程序的开发人员 负责。在

守护进程和请求者代理使用三个restapi进行通信 yapapi-傀儡的Python高级API-旨在大范围抽象使 在傀儡上的应用程序开发尽可能容易。在

如何使用这个API?在

假设你的傀儡节点已经启动并运行(你可以找到关于如何 在yagna repository和我们的 handbook),您需要做的是:

  • prepare your payload—这需要是包含应用程序的Docker映像 将在提供程序端执行。它的卷需要这个映像 以允许管理器模块交换数据(写入和 读文件)用它。这个图像需要打包并上传到傀儡的图像库中 使用我们的专用工具-^{}。在
  • create your requestor agent—这就是yapapi的作用所在。利用我们的高层 在API中,请求者代理的创建应该是向前推进的,并且需要最少的努力。 您可以使用这个存储库中包含的示例(blender和hashcat)作为参考。在

组件

对于任何请求者代理应用程序,有几个组件是至关重要的:

执行人

高级API的核心是请求者的任务执行器(yapapi.Executor)。 在其他程序包中,它会告诉你哪个程序包会运行, 你想付多少钱,你想让多少供应商参与执行。 最后,向它提供worker脚本和要在提供程序上执行的Task对象列表。在

工作脚本

worker很可能是你的请求程序应用程序的核心。你需要定义 此函数在代理代码中,然后将其传递给执行器。在

它接收一个WorkContextyapapi.WorkContext)对象 提供程序和执行单元之间的接口。 使用工作上下文,可以定义提供者需要按顺序执行的步骤 为了完成你交给他们的工作-例如,在提供者之间传输文件 或者在提供程序端的执行单元中运行命令。在

取决于工作人员的数量,因此,您的 执行器并行使用,一个工人可以处理多个任务 (你的工作单位)并且你可以区分需要发生一次的步骤 每工作进程运行,这通常意味着每个提供程序节点一次-但这取决于 你的工人函数的精确实现-从每一个 单个工作单元。前者的一个例子是源文件的上传 对每个片段通用的文件;以及后者的一个步骤,它触发 使用Task数据中指定的一组参数处理文件。在

任务

Taskyapapi.Task)对象描述应用程序需要的工作单元 执行。在

执行器将提供一个你的worker-bou的实例nd到单个提供程序节点- 使用Task对象。工人将负责完成这些任务。一般来说, 它将把每个任务转换成一系列步骤,在一次运行中执行 提供程序计算机上的执行脚本,以便计算任务的结果。在

示例

一个示例傀儡应用程序,使用包含混合器渲染器的Docker图像:

importasynciofromyapapiimportExecutor,Task,WorkContextfromyapapi.logimportenable_default_logger,log_summary,log_event_reprfromyapapi.packageimportvmfromdatetimeimporttimedeltaasyncdefmain(subnet_tag:str):package=awaitvm.repo(image_hash="9a3b5d67b0b27746283cb5f287c13eab1beaa12d92a9f536b747c7ae",min_mem_gib=0.5,min_storage_gib=2.0,)asyncdefworker(ctx:WorkContext,tasks):ctx.send_file("./scene.blend","/golem/resource/scene.blend")asyncfortaskintasks:frame=task.datacrops=[{"outfilebasename":"out","borders_x":[0.0,1.0],"borders_y":[0.0,1.0]}]ctx.send_json("/golem/work/params.json",{"scene_file":"/golem/resource/scene.blend","resolution":(400,300),"use_compositing":False,"crops":crops,"samples":100,"frames":[frame],"output_format":"PNG","RESOURCES_DIR":"/golem/resources","WORK_DIR":"/golem/work","OUTPUT_DIR":"/golem/output",},)ctx.run("/golem/entrypoints/run-blender.sh")output_file=f"output_{frame}.png"ctx.download_file(f"/golem/output/out{frame:04d}.png",output_file)yieldctx.commit()task.accept_result(result=output_file)ctx.log("no more frames to render")# iterator over the frame indices that we want to renderframes:range=range(0,60,10)init_overhead:timedelta=timedelta(minutes=3)# By passing `event_consumer=log_summary()` we enable summary logging.# See the documentation of the `yapapi.log` module on how to set# the level of detail and format of the logged information.asyncwithExecutor(package=package,max_workers=3,budget=10.0,timeout=init_overhead+timedelta(minutes=len(frames)*2),subnet_tag=subnet_tag,event_consumer=log_summary(),)asexecutor:asyncfortaskinexecutor.submit(worker,[Task(data=frame)forframeinframes]):print(f"Task computed: {task}, result: {task.result}")enable_default_logger()loop=asyncio.get_event_loop()task=loop.create_task(main(subnet_tag="community.3"))try:asyncio.get_event_loop().run_until_complete(task)except(Exception,KeyboardInterrupt)ase:print(e)task.cancel()asyncio.get_event_loop().run_until_complete(task)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java类之间并发性不一致的HashMap   插件如何在JavaSwing中使用UIManager和Classloader从外部jar安装外观?   java JasperReports:找不到子报表   在项目中找不到java生成的Javadoc文件   java BigDecimal。multiply()和divide()方法返回十六进制数。为什么?   java统计出现次数并从字符串中删除重复项   调用运算符时发生java NullPointerException   Spring和Hibernate之间的java配置错误   JavaZK将用户重定向回上一页   Javasocket为传出连接指定特定的网络接口   如果拖动到某个区域外,java Make按钮操作将被取消   如何在Eclipse for selenium 3.141.59中添加Java文档链接   java从匹配条件的数组中获取所有索引   docker未连接到RemoteWebDriver的java Gitlab ci selenium测试   java重写run方法   utf 8如何使用java解码UTF8编码的字符串?   java如何从eclipse调试部署在tomcat上的web应用程序?   将字母字符与前面没有百分号的Java正则表达式匹配