我正在建立一个项目,当用户执行特定操作时,我希望发送通知邮件。通过一些搜索,我使用了线程
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的开发服务器)。
我对async/await功能不熟悉。如果有人能够给出全面的解释,我将不胜感激。
await
在asend_mail
上。 - Brian Desturaasync def real_asend_mail(*args, **kwargs): await asend_mail(*args, **kwargs)
,并调用了real_asend_mail
,但仍然在邮件发送后得到了响应。 - Ezon Zhaoasyncio.create_task(real_asend_mail(...))
吗?如果还是不行,你可以尝试在sync_to_async
中添加thread_sensitive=False
参数。 - Brian Desturathread_sensitive=False
就可以了。谢谢!但是为什么呢?这与我在控制台中运行 Daphne,使服务器只有一个进程有关吗? - Ezon Zhao