[英]Running multiple tasks in Python
我有多個服務器,供全球 10,000 個客戶使用。 每個客戶端都可以啟動一個在服務器上運行大約需要 5 分鍾的任務。 而如果服務器滿員,任務需要排隊。
這里的問題是什么是可以支持這個問題的庫的正確架構?具體目標如下:
好吧,這可能是使用celery和使用flower監控的案例。
Celery 是一個簡單、靈活、可靠的分布式系統,可處理大量消息,同時為操作提供維護此類系統所需的工具。 它是一個專注於實時處理的任務隊列,同時也支持任務調度。
Celery 允許同時滿足這兩個要求。 雖然它可能需要更多的工作,但是當系統空閑或您需要消耗更少的 ram 時,可以擴展和減少 cpu、ram 的使用。
我將指出一些關於這個主題的鏈接:
https://www.vinta.com.br/blog/2018/dealing-resource-sumption-tasks-celery/
此外,如果您希望將其與 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.