簡體   English   中英

來自 Flask 的 RQ 任務不斷添加到隊列中

[英]RQ task from Flask keeps adding to queue

我的設置是:

  • 在 docker 上本地運行 Redis
  • 在 virtualenv(rq) 中運行 RQ
  • 在 virtualenv(rq) 中運行 Flask

目標是通過點擊 Flask 應用程序來啟動 RQ 任務。

Redis 似乎運行良好,rq worker 也是如此(由“rq worker”啟動)

簡單的任務會排隊並完成。 簡單的子處理“ls”task2 運行良好。

但我的子處理 python沒有

flask python 代碼(ex1.py):

from flask import Flask, request
import redis
from rq import Queue

import time 

app = Flask(__name__)

r = redis.Redis() #can use password
q = Queue(connection=r)

def task2():
    import subprocess
    result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE)
    output = result.stdout.decode('utf-8')
    print(output)
    return output

def pyv():
    import subprocess
    result = subprocess.run(['python', '--version'], stdout=subprocess.PIPE)
    output = result.stdout.decode('utf-8')
    print(output)
    return output


@app.route('/t2')
def t2():
    job = q.enqueue(task2)
    q_len = len(q)
    return f'Task {job.id} added to queue at {job.enqueued_at}. {q_len} tasks in the queue'

@app.route('/pyv')
def pyv():
    job = q.enqueue(pyv)
    q_len = len(q)
    return f'Task {job.id} added to queue at {job.enqueued_at}. {q_len} tasks in the queue'


@app.route('/get_tasks')
def get_tasks():
    q_len = len(q)
    return f'{q_len} tasks in the queue'

if __name__ == '__main__':
    app.run()

當我點擊端點'/pyv'時,我的“rq worker”window 的 output 發瘋了,似乎正在添加項目(???)......這是一個示例......

17:57:33 default: ex1.pyv() (5378aa3c-9c01-4b42-ad84-f22021de1983)
17:57:34 default: Job OK (5378aa3c-9c01-4b42-ad84-f22021de1983)
17:57:34 Result is kept for 500 seconds
17:57:34 default: ex1.pyv() (0d1edd70-9916-4ffc-bf45-692c60bbc327)
17:57:34 default: Job OK (0d1edd70-9916-4ffc-bf45-692c60bbc327)
17:57:34 Result is kept for 500 seconds
17:57:34 default: ex1.pyv() (99402ee1-909e-474b-b410-be0dfff3f9ea)
17:57:34 default: Job OK (99402ee1-909e-474b-b410-be0dfff3f9ea)
17:57:34 Result is kept for 500 seconds
17:57:34 default: ex1.pyv() (d049328d-e5d9-4767-b3f0-3356aff3d59b)
17:57:34 default: Job OK (d049328d-e5d9-4767-b3f0-3356aff3d59b)
17:57:34 Result is kept for 500 seconds
17:57:34 default: ex1.pyv() (d2cb2ab8-86fe-43e3-8bb9-dc3576672d60)
17:57:34 default: Job OK (d2cb2ab8-86fe-43e3-8bb9-dc3576672d60)
17:57:34 Result is kept for 500 seconds
17:57:34 default: ex1.pyv() (00e8ccbf-2a39-48e6-bd1c-27e6ca982cdc)
17:57:34 default: Job OK (00e8ccbf-2a39-48e6-bd1c-27e6ca982cdc)

...等等...它不會停止,直到我 Cntl+c 並重新啟動 docker Redis。

有任何想法嗎? 我猜使用這個框架啟動這樣的命令行應用程序應該沒問題? 這是我第一次嘗試 RQ+Flask。 我的最終目標是完成一個使用 Tensorflow 的重型 python 命令行應用程序。 我會將我的工人限制在 2 名,並且我確保該應用程序只使用我的 GPU memory 的一半......所有這些都可以正常工作。

但首先,我需要解決這個問題。 - 謝謝。

“答案”是我兩次使用了相同的 function 名稱(pyv)。

def pyv():
    import subprocess
    result = subprocess.run(['python', '--version'], stdout=subprocess.PIPE)
    output = result.stdout.decode('utf-8')
    print(output)
    return output

@app.route('/pyv')
def pyv():
    job = q.enqueue(pyv)
    q_len = len(q)
    return f'Task {job.id} added to queue at {job.enqueued_at}. {q_len} tasks in the queue'

所以帶回家的是不要將您的任務命名為 function 與您的 flask 功能相同!

暫無
暫無

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

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