python - 在长时间工作操作期间发送异步请求
问题描述
我有一种情况,我的处理功能可能需要很长时间才能运行。此函数将进度观察者作为参数,并通知观察者有关进度。
我想发送异步 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
它。
解决方案
推荐阅读
- python - 尽管使用 wifi 工作,但 SMTP 发送无法从 4G 工作
- python - 将 Pandas 值从索引设置为索引
- c# - 如何取消现有任务并在完成后运行新任务?
- mysql - 如何将 Flask 应用程序容器与 MySQL 服务器容器连接?
- neo4j - Cypher Match-MERGE 查询在 ConstraintValidationFailed 上失败
- reactjs - React、react-sortable-hoc 和多个列表
- c# - 表单应用程序注册表项
- xamarin - 如何将 Xamarin 表单标签 TextType 设置为 HTML?
- php - Laravel 7:如何使用按段设置活动类
- date - Pyspark 格式日期