Как запустить функцию в фоновом режиме, чтобы она не останавливала работу других страниц django
У меня есть скрипт, который начинает загрузку звукового файла, когда пользователь нажимает кнопку на сайте, но когда один пользователь начинает загрузку, весь бэкенд останавливается и ждет, пока она не закончится, прежде чем любой другой пользователь сможет воспользоваться сайтом.
songList = await self.getSongs()
await self.downloadSongs(songList)
async def downloadSongs(self, songList):
dirList = os.listdir("Directory")
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'loadingGameGroup',
})
downloadThread = threading.Thread(target=self.download, args=(songList, dirList))
downloadThread.start()
downloadThread.join()
def download(self, songList, dirList):
for song in songList:
try:
self.downloadSong(song, dirList)
except:
self.downloaded = False
return
def downloadSong(self, song, dirList):
songId = song["song_id"]
if songId + ".mp3" in dirList:
return
video_url = "https://www.youtube.com/watch?v="+ songId
video_info = youtube_dl.YoutubeDL().extract_info(
url = video_url,download=False
)
filename = "Directory" + songId + ".mp3"
options={
'format':'bestaudio/best',
'keepvideo':False,
'outtmpl':filename,
}
with youtube_dl.YoutubeDL(options) as ydl:
ydl.download([video_info['webpage_url']])
Как сделать так, чтобы он загружал песни, ждал, пока одна группа песен закончит, чтобы я мог отправить сообщение websocket обратно клиенту, чтобы тот мог продолжить. В то время как другим группам не нужно ждать окончания загрузки, чтобы что-то сделать
Задача, стоящая перед вами, упрощается при использовании таких пакетов, как RabbitMQ или celery, По сути, вы будете создавать множество отдельных рабочих, которые будут принимать задания из вашей загружаемой queue, я рекомендую использовать RabbitMQ для этого, поскольку celery может быть немного сложным.
https://www.rabbitmq.com/tutorials/tutorial-one-python.html
Если вы хотите использовать для этого обычный django сервер, то он просто не будет работать из-за природы веб-страниц.