首页 > 解决方案 > 在长时间工作操作期间发送异步请求

问题描述

我有一种情况,我的处理功能可能需要很长时间才能运行。此函数将进度观察者作为参数,并通知观察者有关进度。

我想发送异步 http 请求以报告所述进度,并尽快返回处理功能。

def longProcessingFunction(progressObserver):
    # processing in a loop ...
        progressObserver.updateProgress(x)
    # more processing ...
class MyClass():
    def runLongProcessingFunction(slef):
        results = longProcessingFunction(self)
        # send last request to report results (ideally *after* last progress message) like:
        # requests.patch(self.reportingUrl, json={'results': results, 'progress': 1.0})

    def updateProgress(self, progress):
        # send async http request to report progress like:
        # requests.patch(self.reportingUrl, json={'progress': progress})
        # ideally handle the response on next progress update
        # (if it arrived by that time - otherwise on the one after it)

我尝试使用asyncio,但似乎它的主要目的是使用主事件循环,并向其中添加多个异步任务。我什至尝试在函数中应用一种有点奇怪的run_once 方法updateProgress,但除了它真的强迫我的场景之外,asyncio我无法让应用程序等待最后一个待处理的进度任务并在它之后发送结果请求(任何等待对于所有任务尝试都失败了,因为我从来没有真正处于asyncio循环中 - 我正在使用它来“运行一次”)。

就我而言,与正常asyncio代码的工作方式相比,每当我运行时,longProcessingFunction()我都会被阻塞,直到它完成处理(除了被调用的进度观察器)。

寻找任何合理的架构,无论是否有asyncio它。

标签: pythonpython-asyncio

解决方案


推荐阅读