我正在生成项目,希望在用户执行特定操作时发送通知电子邮件。
我做了一些搜索,并设法实现这一点使用threading.Thread
。由于Django现在完全支持异步视图,我想这样做的异步函数。
下面是我的尝试:
from asgiref.sync import sync_to_async
from django.core.mail import send_mail
from django.shortcuts import render
from myproj.settings import EMAIL_HOST_USER
import asyncio
asend_mail = sync_to_async(send_mail)
async def index(request):
asyncio.create_task(
asend_mail(
subject='Test',
message='Lorem ipsum',
from_email=EMAIL_HOST_USER,
recipient_list=['ezon@stackoverflow.dummy']
)
)
return render(request, 'myapp/index.html', {})
然而,当我请求这个索引页时,我仍然在asend_mail
协程完成后得到响应。
我已经尝试了以下简单的异步函数(来自一个教程),一切都按预期工作。
async def async_print():
for num in range(1, 6):
await asyncio.sleep(1)
print(num)
async def index(request):
asyncio.create_task(async_print())
return render(request, 'myapp/index.html', {})
我想知道上述两种情况的关键区别是什么。
我使用的是python 3.10.7,django 4.1.2,daphne 3.0.2(作为服务器,而不是django的开发服务器)。
我是异步/等待特性的新手。如果有人能给出一个全面的解释,我将不胜感激。
1条答案
按热度按时间2ledvvac1#
我会尝试线程(请参见:https://realpython.com/intro-to-python-threading/用于参考)
我用它上传了1000个(大)文件到一个S3的存储桶里,比按顺序上传快了70倍。
这个想法是,这个电子邮件任务将被 Package 在一个线程中,线程将被发出,你的代码将从那里继续,而不是等待任务(在线程中)完成。