如何同步处理Flask请求
How to process Flask requests synchronously
我正在尝试创建一个 Flask API,它将接收多个 HTTP GET 请求并按照接收到的顺序一个一个地处理它们。
GET 请求调用的子程序是一个 pywinauto 程序,因此一次只调用它的一个实例很重要。
我试过使用 Celery + RabbitMQ 和普通 python 队列。
我在想某种队列是可行的方法,但到目前为止我所做的一切都导致请求被同时处理。
任何指导都会有所帮助。
我的 Celery 任务路线
@app.route('/ClientEntry', methods=['GET'])
def createClient():
crmid = request.args.get('crmid')
if crmid:
result = inputClient.apply(args=[crmid])
print('inside '+ result.get(timeout=120))
return json.dumps({'success':True}), 200, {'ContentType':'application/json'}
else:
raise BadRequest('CRM ID cannot be empty')
我的 Celery tasks.py(运行 在 Windows 环境中,因此必须手动设置 FORKED_BY_MULTIPROCESSING
变量)
from celery import Celery
import os
os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '0') #tried both 0 and 1
os.environ.setdefault('CELERY_ALWAYS_EAGER', 'True') #tried both with and without this, 'True', 'False', '0', and '1'
app = Celery('tasks', backend='rpc://', broker='amqp://guest@localhost')
@app.task
def inputClient(crmid):
uiInputClient(crmid)
启动 celery worker 时将 CELERYD_CONCURRENCY
设置为 1
并且只启动一个 worker。这将使一次只运行一个任务。
有关详细信息,请查看 celery docs。
我正在尝试创建一个 Flask API,它将接收多个 HTTP GET 请求并按照接收到的顺序一个一个地处理它们。
GET 请求调用的子程序是一个 pywinauto 程序,因此一次只调用它的一个实例很重要。
我试过使用 Celery + RabbitMQ 和普通 python 队列。
我在想某种队列是可行的方法,但到目前为止我所做的一切都导致请求被同时处理。
任何指导都会有所帮助。
我的 Celery 任务路线
@app.route('/ClientEntry', methods=['GET'])
def createClient():
crmid = request.args.get('crmid')
if crmid:
result = inputClient.apply(args=[crmid])
print('inside '+ result.get(timeout=120))
return json.dumps({'success':True}), 200, {'ContentType':'application/json'}
else:
raise BadRequest('CRM ID cannot be empty')
我的 Celery tasks.py(运行 在 Windows 环境中,因此必须手动设置 FORKED_BY_MULTIPROCESSING
变量)
from celery import Celery
import os
os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '0') #tried both 0 and 1
os.environ.setdefault('CELERY_ALWAYS_EAGER', 'True') #tried both with and without this, 'True', 'False', '0', and '1'
app = Celery('tasks', backend='rpc://', broker='amqp://guest@localhost')
@app.task
def inputClient(crmid):
uiInputClient(crmid)
启动 celery worker 时将 CELERYD_CONCURRENCY
设置为 1
并且只启动一个 worker。这将使一次只运行一个任务。
有关详细信息,请查看 celery docs。