Django 实现协程
Djano实现协程示例
需要在视图类中调用event_loop, 并将异步函数传入event_loop。
import asyncio
import datetime
import time
from rest_framework.views import APIView
class AsyncioView(APIView):
def get(self, request, *args, **kwargs):
# 创建事件循环对象
loop = asyncio.new_event_loop()
# 将当前线程的事件循环设置为loop循环对象
asyncio.set_event_loop(loop)
self.loop = loop
try:
result = self.loop.run_until_complete(
self.gather_tasks(*args,**kwargs))
finally:
self.loop.close()
return JsonResponse({'result': result})
async def gather_tasks(self,*args,**kwargs):
tasks = []
for i in range(5):
fut = self.make_future(self.io_task,{'param':i})
tasks.append(fut)
results = await asyncio.gather(*tasks)
return results
async def make_future(self,func,*args,**kwargs):
future = self.loop.run_in_executor(None,func,*args,**kwargs)
response = await future
return response
def io_task(self,param):
time.sleep(3)
print(f'task {param} finished!')
return f'task {param} finished at {datetime.datetime.now()}'
返回结果:
{
"result": [
"task {'param': 0} finished at 2023-12-01 15:22:26.015853",
"task {'param': 1} finished at 2023-12-01 15:22:26.014860",
"task {'param': 2} finished at 2023-12-01 15:22:26.014860",
"task {'param': 3} finished at 2023-12-01 15:22:26.015853",
"task {'param': 4} finished at 2023-12-01 15:22:26.015853"
]
}