我想每个人都知道如何处理django中的长期任务:使用芹菜和放松.但是,如果我想通过aiohttp(或龙卷风)获得websockets的好处呢?
假设我有很多CPU绑定任务,可能需要几秒钟到多个(5-10)分钟.在websocket循环中处理此任务并通知用户进度似乎是个好主意.没有ajax请求,对短任务的响应速度非常快.
async def websocket_handler(request):
ws = web.WebSocketResponse()
await ws.prepare(request)
async for msg in ws:
if msg.tp == aiohttp.MsgType.text:
answer_to_the_ultimate_question_of_life_the_universe_and_everything =\
long_running_task(msg.data, NotificationHelper(ws))
ws.send_str(json.dumps({
'action': 'got-answer',
'data': answer_to_the_ultimate_question_of_life_the_universe_and_everything,
}))
return ws
Run Code Online (Sandbox Code Playgroud)
但另一方面,按照我的理解,以这种方式提供服务的CPU绑定任务会阻塞整个线程.如果我有10个工作人员和11个想要使用应用程序的客户端,则在第一个客户端的任务完成之前,将不会提供第11个客户端.
也许,我应该运行在芹菜中看起来很大的任务和在主循环中看起来很小的任务?
所以,我的问题是:是否有任何好的设计模式用于为异步服务器提供长期运行的任务?
谢谢!
假设我有一个内部使用asyncio循环且没有异步接口的类:
class Fetcher:
_loop = None
def get_result(...):
"""
After 3 nested sync calls async tasks are finally called with *run_until_complete*
"""
...
Run Code Online (Sandbox Code Playgroud)
我在内部使用asyncio的所有优点,而不必在外部代码中关心它。
但是然后我想Fetcher在一个事件循环中调用3个实例。如果我有async def界面,那就没有问题:asyncio.gather可以帮助我。如果不同时支持两个接口,是否真的没有其他方法可以做到?来吧!它使您由于一次异步使用而更改了所有项目。告诉我这不是真的。