Как я могу убедиться, что эта задача Python RQ на сервере Redis выполняется? - PullRequest
0 голосов
/ 11 июля 2020

В приложении Flask у меня есть функция, которая принимает список списков и добавляет каждый в виде строки в файл Excel. Эта функция отлично работает на сервере разработки, когда время ожидания запроса не истекает. Здесь он заключен в блок try / except. Вот как мне нужно вызвать его на prod-сервере как задачу в очереди.

def make_excel_file(file_title, lists_to_print):

  try:
    job = get_current_job()

    # returns a list of lists
    # the first list is the header row (titles of attributes)
    # the following lists are all lists of the relevant object attributes
    # as well as some joined object attributes
    # (e.g. user ID, user email, drive year)
    rows = wish_list_rows(lists_to_print)

    wb = Workbook()
    ws = wb.active

    tempfile = NamedTemporaryFile()
    tempfile.name = file_title

    num_rows = len(rows)

    _set_task_progress(0, "excel_progress") #This results in a valid notification
                                            # so I know the function reaches at least this point


    for r in rows:
      ws.append(r)
      wb.save(tempfile)
      tempfile.seek(0)

      _set_task_progress(100.0 * (num_rows/rows.index(r)), "excel_progress") #the number never
                                                                             #updates, so the for loop
                                                                             #must never begin
    stream = tempfile.read()

    response = make_response(stream)
    response.headers['Content-Disposition'] = "attachment; filename={}".format(
      file_title)
    response.mimetype = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  except:
    flash("Lists could not be exported to Excel.", "warning")
  finally:
    _set_task_progress(100, "excel_progress")
  if response:
    return response

Используя локальный сервер Redis CLI и команду redis-cli monitor, я могу увидеть следующий вывод:

~$ redis-cli monitor
OK
1594476959.432554 [0 [::1]:61680] "HGETALL" "rq:job:cfabaad5-b586-4aba-90b1-61addb5c9ea9"
1594476959.485371 [0 [::1]:61680] "MULTI"
1594476959.485408 [0 [::1]:61680] "LREM" "rq:queue:spur-hcd-tasks" "1" "cfabaad5-b586-4aba-90b1-61addb5c9ea9"
1594476959.487109 [0 [::1]:61680] "EXEC"
1594476976.799187 [0 [::1]:61680] "MULTI"
1594476976.801143 [0 [::1]:61680] "SADD" "rq:queues" "rq:queue:spur-hcd-tasks"
1594476976.803906 [0 [::1]:61680] "HSET" "rq:job:18be4075-8e3c-409c-a5cf-f82f3d11ba42" "status" "queued"
1594476976.803958 [0 [::1]:61680] "HMSET"
"rq:job:18be4075-8e3c-409c-a5cf-f82f3d11ba42"
"created_at" "2020-07-11T14:16:15.310435Z"
"data" "x\x9c\x94\xbd[\xcc / GIANT BYTE STRING / "
"origin" "name-of-queue"
"description" "app.tasks.make_excel_file(1, file_title='All lists', lists_to_print=[\n            column_1_data, (\"column_2_data\"), column_3_data, column_5_data.\n            , \n..." "enqueued_at" "2020-07-11T14:16:16.749772Z"
"started_at" "" "ended_at" ""
"timeout" "180" "status" "queued"
1594476976.841367 [0 [::1]:61680] "RPUSH" "rq:queue:spur-hcd-tasks" "18be4075-8e3c-409c-a5cf-f82f3d11ba42"
1594476976.841410 [0 [::1]:61680] "EXEC"
1594476977.433481 [0 [::1]:61680] "HGETALL" "rq:job:18be4075-8e3c-409c-a5cf-f82f3d11ba42"

Я не знаю, как это интерпретировать. Я также хотел бы помочь понять, как дальше отлаживать и просматривать, что происходит в этой функции на локальном сервере Redis.

Изменить: теперь я вижу, что может быть что-то не так с очередью, настроенной для приложения . Когда я получаю задания из RQ с помощью get_current_job (), я могу получить к нему доступ. Однако все реестры очереди приложения пусты. Что может помешать очереди приложения выполнить задание, если оно действительно существует на сервере Redis как в redis-cli, так и для Python RQ?

...