我想创建类似于以下内容的管道:
HttpGetHtmlFromA --|
|--> ExtractComments --> ExtractKeywords --> NotifyOverHttp
HttpGetJsonFromB --|
为此我考虑了两种不同的方法,并且我很好奇要提出一些最适合该任务的辅助意见。
第一种方法将利用线程,上述每个操作(即GetHtmlFromA,GetJsonFromB,ExtractComments等)都在各自的线程上运行。在管道的每个集成点之间将存在三个不同的队列,以便将数据向下传递。
我想到的后一种方法将异步完成所有操作。以上操作将被表示为单独的任务,每个任务在asyncio事件循环中无限期运行。数据仍将通过队列传递。
虽然我倾向于异步设计事物,但是我不确定哪种方法最有效。请注意,HttpGetHtmlFromA和HttpGetJsonFromB是轮询URL的生产者。执行完各自的http请求后,他们将延迟约10秒钟,然后再提出后续的http请求。这似乎很适合异步模型,因为它允许在轮询之间进行一些工作。也就是说,ExtractComments和ExtractKeywords可能会长时间运行(主要是)CPU限制的任务,这些任务会解析传入的内容。
无论如何,我很想听听您对此事的想法:线程与协程。我有没有考虑过一种完全不同的方法?