根据此示例修改应用程序,我在初始化web.1 dyno期间部署更新的Heroku应用程序时遇到问题。
在我的开发环境中一切正常;当我直接启动"app"和"worker"可执行文件时,我可以从127.0.0.1:5000访问工作应用程序
。我已经创建了 postgresql 和 redistogo 插件作为应用程序的一部分......
英雄库配置文件
=== 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)}")
在测功机启动期间,我收到以下错误:
heroku[web.1]:状态从崩溃变为开始
heroku[web.1]:使用命令
bash heroku.sh
启动进程app[web.1]:命令 # 2 (HSET rq:worker:2bd1d3d3a7f04d2fb7a09b34786689bf 出生2020-05-23T11:28:04.485474Z last_heartbeat 2020-05-23T11:28:04.485474Z 队列默认 PID 11 主机名 B428750B-5D7F-4837-B9C2-B2195E234978 版本 1.4.1 python_version 3.7.4(默认,2019 年 9 月 12 日 01:19:52(
app[web.1]:[GCC 7.4.0]( 的管道导致错误:"hset"命令的参数数量错误
heroku[web.1]:进程退出,状态为 0
heroku[web.1]:状态从开始变为崩溃
我相当确信错误在 worker.py 文件中突出显示的worker.work()
行中,因为我在运行heroku run python worker.py
时遇到相同的错误(或直接将这些行复制到heroku run python
REPL 解释器中(
我遇到了类似的问题,我通过将我的 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(( 方法期间中断......
工作线程 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': [], ... ...
}
工作线程 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...