【Hacker News搬运】Go和我对所谓的“Promises”模式的认识
-
Title: Go and my realization about what I'll call the 'Promises' pattern
Go和我对所谓的“Promises”模式的认识
Text:
Url: https://utcc.utoronto.ca/~cks/space/blog/programming/GoAndPromisesPattern
很抱歉,我无法直接访问外部链接或执行网络请求来抓取网页内容。不过,我可以提供一些指导,告诉你如何使用 JinaReader(一个Python库)来抓取网页内容,并将其翻译成中文。 以下是一个使用 JinaReader 和 Google Translate API 来抓取和翻译网页内容的示例代码。请注意,你需要先安装 JinaReader 和其他必要的库,并且需要设置 Google Cloud Platform 账户以使用 Google Translate API。 ```python from jina import Document, Indexer, Flow from jina_helper import get_jina_flow import requests from google.cloud import translate_v2 as translate # 初始化 Google Translate API 客户端 translate_client = translate.Client() # 创建一个 Jina 流 flow = get_jina_flow() # 添加一个 Indexer 来抓取网页内容 flow.add( Indexer( index_filename='index.jina', output_size=10, index_mode=' overwrite', chunk_size=1024, batch_size=10, output_attrs=['url', 'content', 'title'], add_to_index=True ) ) # 设置要抓取的 URL url = "https://utcc.utoronto.ca/~cks/space/blog/programming/GoAndPromisesPattern" # 使用 requests 库获取网页内容 response = requests.get(url) html_content = response.text # 将 HTML 内容转换为 Jina 文档 doc = Document(url=url, title=url.split('/')[-1], content=html_content) # 使用 Jina 流处理文档 flow.run(doc) # 翻译文档内容 translated_content = translate_client.translate( doc.content, target_language='zh-CN' ).get('translatedText') # 打印翻译后的内容 print(translated_content) # 总结内容 summary = "..." # 这里你可以使用一些自然语言处理工具来生成总结 print(summary)
请注意以下几点:
- 你需要安装
jina
,requests
, 和google-cloud-translate
等库。 - 你需要配置 Google Cloud Platform 并启用 Google Translate API。
- 上述代码中的
get_jina_flow
函数是一个假设的函数,用于初始化 Jina 流。你需要根据 Jina 的官方文档来设置流。 - 翻译功能是通过 Google Translate API 实现的,它可能需要你提供一个有效的 API 密钥。
- 生成总结的部分需要你使用一个自然语言处理工具或服务,例如使用 Hugging Face 的 Transformers 库中的模型。
由于我无法执行代码或访问外部资源,以上代码仅供参考。
## Post by: ingve ### Comments: **caleblloyd**: Shortcut could be to create an array of sync.OnceValue, immediately invoking each element in a goroutine. Then iterate through the array and call each function again. > **caleblloyd**: 快捷方式可以是创建同步数组。OnceValue,立即调用goroutine中的每个元素。然后迭代数组并再次调用每个函数。 **davery22**: So: A channel with buffer size 1, so long as it is only written to once and read from once, feels a lot like a Promise. > **davery22**: 所以:缓冲区大小为1的通道,只要只写入一次并从一次读取,感觉就很像Promise。 **ekimekim**: It's been a while since I did much Go, but I think you can handle this cleanly by making one channel per task, and having an array of channels similar to the array of promises. Each channel takes that task's result, then closes. The caller waits on each channel in sequence. > **ekimekim**: 它;我已经有一段时间没有做很多Go了,但我认为你可以通过为每个任务创建一个通道,并拥有一个类似于promise数组的通道数组来干净地处理这个问题。每个通道都承担该任务;结果,然后关闭。呼叫者按顺序在每个频道上等待。 **XorNot**: The "in-order" requirement makes this a weird problem to think you have. There's no situation where the channels are going to be heavier then the go-routines you're spawning to handle the processing: in fact the last line lamenting leaving blocked go-routines around is weird, because a blocked go-routine is still using less resources then one actually doing things - it's totally fine for them to block waiting to write to the channel because of the "in-order" requirement.<p>Your worst case scenario is you spawn N go-routines, and they complete 1 by 1 in reverse order from N so your entire dataset is waiting in memory for in-order completion - so no other concern here matters at all. > **XorNot**: ";为了“;这个要求让你觉得这是一个奇怪的问题。那里;在任何情况下,频道都不会比围棋更重;重新生成以处理处理:事实上,最后一行哀叹让阻塞的go例程到处乱跑是很奇怪的,因为阻塞的go例行程序仍然比实际执行的程序使用更少的资源——它;他们完全可以阻止等待写入频道,因为“;为了“;要求<p> 最坏的情况是,你生成了N个go例程,它们从N开始以相反的顺序逐一完成,所以你的整个数据集都在内存中等待按顺序完成——所以这里没有其他问题。
- 你需要安装