📜  Python – 使用 RabbitMQ 的异步任务

📅  最后修改于: 2022-05-13 01:55:23.862000             🧑  作者: Mango

Python – 使用 RabbitMQ 的异步任务

您是否曾经遇到过需要在后台执行需要花费大量时间才能完成的任务的问题?你有没有想过在一定的时间间隔后执行一项任务?如果您对上述任何问题的回答是“是”,那么Python已经涵盖了您。我们将演示如何使用RabbitMQ执行异步任务。

异步到底是什么意思
异步意味着通过使用前一个操作完成时发送的信号而不是定期发送的信号来控制要执行的操作的时间。

RabbitMQ什么?
RabbitMQ 是一个消息代理软件,最初实现了高级消息队列协议 (AMQP),后来通过插件架构进行了扩展,以支持流式文本消息传递协议 (STOMP)、MQ 遥测传输 (MQTT) 和其他协议.如果这对您来说听起来很复杂,请不要担心,我们已经为您提供了保障。所以,简单来说,它提供了一个队列,通过运行自己的服务器在后台执行任务。

所有这些都弄清楚了,让我们开始安装 RabbitMQ 和其他必要的工具。因此,我们将使用一个名为Celery的Python包来连接 RabbitMQ。 Celery 提供了一种将任务连接和发送到队列 (RabbitMQ) 的简单方法。从技术上讲,Celery 是一个Python任务队列系统,用于处理跨线程或网络节点在工作人员上分配任务。

你应该在你的系统上安装了Python 。然后你需要在你的系统上安装 Celery。为此,只需键入以下内容

pip install celery==4.4.2

接下来,在您的机器上安装 RabbitMQ。为此,请访问他们的官方页面并根据您的操作系统下载安装程序。您可能需要下载ErLang和 RabbitMQ。安装后在终端中输入以下内容

rabbitmq-server restart

你应该得到这样的输出

RabbitMQ 终端

不要关闭此终端。现在您的经纪人应该正在运行。要检查这一点,请在浏览器中访问 http://localhost:15672/ 并输入用户名和密码。默认用户名是guest ,默认密码也是guest 。你应该看到这样的东西

RabbitMQ 本地主机

现在,让我们开始有趣的部分,也就是编码。

我们将下载一个 YouTube 视频到我们的系统。我们将使用pytube模块来下载它。要安装 pytube,请键入以下内容

pip install pytube3

下载 YouTube 视频可能会占用大量时间。我们现在将看到,我们的Python文件是如何立即执行的,并且视频在后台继续下载。

首先,我们将创建一个名为task_queue.py的Python文件

from celery import Celery
import sys
  
from pytube import YouTube
  
# Where the downloaded files will be stored
BASEDIR ="D:\\"
  
# Create the app and set the broker location (RabbitMQ)
app = Celery('downloader',
            backend ='rpc://',
            broker ='pyamqp://guest@localhost//')
  
@app.task
def download(url, filename):
    """
    Download a page and save it to the BASEDIR directory
      url: the url to download
      filename: the filename used to save the url in BASEDIR
    """
    try:
        # object creation using YouTube which
        # was imported in the beginning
        yt = YouTube(url)
    except:
        print("Connection Error") # to handle exception
  
    # filters out all the files with "mp4" extension
    yt.streams\
        .filter(progressive = True, file_extension ='mp4')\
        .order_by('resolution')[-1]\
        .download(output_path = BASEDIR, filename = filename) 
        # downloading the video
  
    print('Task Completed !')

我们需要另一个Python文件来运行此代码(您可以在同一个文件中执行此操作,但从另一个文件调用该函数是一个好习惯)。创建另一个名为runtask.py的文件

import sys
from task_queue import download
  
# gets the first command line argument
link = sys.argv[1]
  
# gets the second command line argument
filename = sys.argv[2]
  
# calling the download function
download.delay(link, filename)

现在,开始芹菜。为此,请在您的工作目录中打开一个终端并键入以下内容

celery -A task_queue worker --pool=solo -E

如果你得到任何错误,那么你的 RabbitMQ 服务器没有运行或者你不在你的工作目录中。你应该得到这样的输出

芹菜

现在我们运行 Celery。现在在同一目录中打开另一个终端并运行以下命令

$ python runtask.py https://www.youtube.com/watch?v=vG2PNdI8axo Geeksforgeeks

完成上述命令后,等待几秒钟以允许下载在后台完成。然后转到您的D:驱动器,在那里您会看到一个名为Geeksforgeeks.mp4的文件。就是这样了。您的视频已下载。

异步任务在现实生活中非常重要。当您的代码执行任务时,您不能让您的软件或网站停留在加载页面。需要较长时间执行的任务在后台执行,而不会停止主线程。