簡體   English   中英

在 Python 中運行多個任務

[英]Running multiple tasks in Python

我有多個服務器,供全球 10,000 個客戶使用。 每個客戶端都可以啟動一個在服務器上運行大約需要 5 分鍾的任務。 而如果服務器滿員,任務需要排隊。

這里的問題是什么是可以支持這個問題的庫的正確架構?具體目標如下:

  1. 同時監控和運行多個任務
  2. 監控資源,只有在有足夠資源時才從隊列中取出任務

好吧,這可能是使用celery和使用flower監控的案例。

Celery 是一個簡單、靈活、可靠的分布式系統,可處理大量消息,同時為操作提供維護此類系統所需的工具。 它是一個專注於實時處理的任務隊列,同時也支持任務調度。

Celery 允許同時滿足這兩個要求。 雖然它可能需要更多的工作,但是當系統空閑或您需要消耗更少的 ram 時,可以擴展和減少 cpu、ram 的使用。

我將指出一些關於這個主題的鏈接:

Celery - 最小化 memory 消耗

https://www.vinta.com.br/blog/2018/dealing-resource-sumption-tasks-celery/

https://medium.com/@alaminopu.me/solving-rabbitmq-high-cpu-memory-usages-problem-with-celery-d4172ba1c6b3

此外,如果您希望將其與 apache-kafka 集成,請檢查此 stackoverflow 問題

您必須設置一個消息代理,例如 RabbitMQ 或 Redis。 如果隊列的數據應該是持久的,我建議你使用 RabbitMQ。 要發送和接收任務,您可以使用 Celery 它允許您將任務發送到隊列並在 Celery 工作人員中運行這些任務。 對於隊列監控存在Flower。 在這個時代,一個非常好的做法是使用 docker 來實現您的所有架構。 我向您展示了一個 docker-compose.yml 示例,它設置了 3 個容器:Rabbit、flower 和 celery。 您唯一需要做的就是運行命令docker-compose up -d

version: '3.3'
services:
  rabbit:
    image: rabbitmq:3-management-alpine
    restart: always
    environment:
      RABBITMQ_ERLANG_COOKIE: cookie
      RABBITMQ_DEFAULT_USER: Admin 
      RABBITMQ_DEFAULT_PASS: 1234
    ports:
      - 5672:5672
      - 15672:15672

  celery:
    build: 
      context: .
    volumes: 
      - ./src:/app
    command: celery -A appendapp worker --loglevel=debug
    environment: 
      RABBITMQ_HOST: rabbit

  flower:
    image: mher/flower
    restart: always
    ports:
      - 5555:5555
    command:
      - "--broker=amqp://Admin:1234@rabbit//"

./src/appendapp.py的代碼從一個json文件中讀取一個列表,然后添加一個項目,最后將更新后的列表保存到文件中。 代碼如下所示:

from celery import Celery
import os, json, time

# Where the downloaded files will be stored
BASEDIR="./hola.json"

RABBIT_HOST = os.getenv("RABBITMQ_HOST") or "localhost"

# Create the app and set the broker location (RabbitMQ)
app = Celery('appendapp',
             backend='rpc://',
             broker=f'pyamqp://Admin:1234@{RABBIT_HOST}//')

@app.task
def add_item(item):
    #time.sleep(2.5)
    file = open(BASEDIR)
    data = json.load(file)
    data.append(item)
    file.close()
    wfile = open(BASEDIR, "w")
    json.dump(data, wfile)
    wfile.close()
    return f"Se agrego {item}"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM