Issue Deploying Heroku App - RQ Worker: wrong number of arguments for 'HSET' command
Modifying an app based on this example, I am having a problem when deploying my updated Heroku app during initialization of the web.1 dyno.
Everything is working fine in my development envr; when I start the 'app' and 'worker' executables directly, I can access the working app from 127.0.0.1:5000
I already have the postgresql and redistogo addons created as part of the app...
heroku config file
=== app Config Vars
APP_SETTINGS: config.StagingConfig
DATABASE_URL: postgres://[points-to-AWS-EC2].compute-1.amazonaws.com:[port]/[identifier]
REDISTOGO_URL: redis://redistogo:[identifier]@pike.redistogo.com:[port]/
Procfile
web: bash heroku.sh
heroku.sh
#!/bin/bash
gunicorn app:app --daemon
python worker.py
app.py
from collections import Counter
from datetime import datetime
import json
import re
import operator
import os
from flask import Flask, render_template, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from requests import get, exceptions as rx
import nltk
from rq import Queue
from rq.job import Job
from validators import url as vurl
from worker import conn
app = Flask(__name__, template_folder='app-templates/')
app.config.from_object(os.environ['APP_SETTINGS'])
db = SQLAlchemy(app)
q = Queue(connection=conn)
def worker_task(url):
'''
takes website url and ...
worker.py
import os
import redis
from rq import Worker, Queue, Connection
listen = ['default']
redis_url = os.getenv('REDISTOGO_URL', 'redis://localhost:6379')
conn = redis.from_url(redis_url)
if __name__ == '__main__':
# for tracking worker job in a terminal
# assumptions: redis-server is running
try:
with Connection(conn):
worker = Worker(list(map(Queue, listen)))
--->>> worker.work() <<<---
except Exception as e:
print(f"{str(e)}")
During the dyno startup, I get the following errors:
heroku[web.1]: состояние изменено с сбоя на запуск
heroku[web.1]: запуск процесса командой
bash heroku.sh
app[web.1]: Команда № 2 (HSET rq:worker:2bd1d3d3a7f04d2fb7a09b34786689bf Birth 2020-05-23T11:28:04.485474Z last_heartbeat 2020-05-23T11:28:04.485474Z очереди по умолчанию pid 11 hostbname-b428750b9c2-b2195e234978 версия 1.4.1 python_version 3.7.4 (по умолчанию, 12 сентября 2019 г., 01:19:52)
app[web.1]: [GCC 7.4.0]) конвейера вызвала ошибку: неправильное количество аргументов для команды 'hset'
heroku[web.1]: процесс завершен со статусом 0
heroku[web.1]: состояние изменено с начала на сбой
Я почти уверен, что ошибка находится в выделенном worker.work()
строку из файла worker.py, потому что я получаю ту же ошибку при запуске heroku run python worker.py
(или напрямую копируя эти строки в heroku run python
Интерпретатор REPL)
2 ответа
У меня была аналогичная проблема, и я исправил ее, понизив версию rq с 1.4.1 до 1.3.0.
РЕШЕНА была проблема с моими версиями пакетов...
исходный пример, который я использовал, имел следующие зависимости версии пакета:
redis = "==3.4.1"
rq = "==1.2.2"
но я просто использовал самые последние обновленные пакеты = "*"
для обоих, и когда я первоначально развернул пакет в Heroku, он установил версию RQ "1.4.0", но затем (очевидно), когда мое новое приложение было развернуто, установщик Heroku использовал последний пакет 1.4.1, который сломался во время worker.work() метод...
Выход Worker RQ v 1.4.0:
{
'connection': Redis<ConnectionPool<Connection<host=pike.redistogo.com,port=10038,db=0>>>,
'hostname': 'e868b6d3-70b4-4e17-98c2-b96aae04d9a8',
'pid': 39,
'job_class': <class 'rq.job.Job'>,
'queue_class': <class 'rq.queue.Queue'>, 'version': '1.4.0',
**'python_version': '3.7.4 (default, Sep 12 2019, 01:19:52) \n[GCC 7.4.0]',**
**'serializer': <module 'pickle' from '/app/.heroku/python/lib/python3.7/pickle.py'>,**
'name': '05c7af34c21f44f0b4374b40525779af',
'queues': [Queue('default')],
'_exc_handlers': [], ... ...
}
Выход Worker RQ v1.4.1:
{
'connection': Redis<ConnectionPool<Connection<host=pike.redistogo.com,port=11022,db=0>>>,
'hostname': '19a476fa-b4e6-4e63-b40e-ac8779ae0f9e',
'pid': 39,
'job_class': <class 'rq.job.Job'>,
'queue_class': <class 'rq.queue.Queue'>,
'version': '1.4.1',
**'python_version': '3.7.4 (default, Sep 12 2019, 01:19:52) \n[GCC 7.4.0]',**
**'serializer': <class 'rq.serializers.DefaultSerializer'>,**
'name': 'b63389b3499f4d73be889a33f3777b46',
'queues': [Queue('default')],
'_exc_handlers': [], ... ...
}
Вы можете увидеть разницу в ключе "сериализатора" между ними, что, возможно, привело к возникновению исключения HSET...
Возврат к RQ v1.2.2 решил проблему для меня; Я, наверное, мог бы использовать ту же v1.4.0...