0

根据此示例修改应用程序,在 web.1 dyno 初始化期间部署更新的 Heroku 应用程序时遇到问题。

在我的开发环境中一切正常;当我直接启动“app”和“worker”可执行文件时,我可以从 127.0.0.1:5000 访问正在工作的应用程序

我已经有作为应用程序的一部分创建的 postgresql 和 redistogo 插件......

heroku 配置文件

=== 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]/

档案

web: bash heroku.sh

heroku.sh

#!/bin/bash
gunicorn app:app --daemon
python worker.py

应用程序.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 ...

工人.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 主机名 b428 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.work()worker.py 文件中突出显示的行中,因为我在运行时遇到了同样的错误heroku run python worker.py(或直接将这些行复制到heroku run pythonREPL 解释器中)

4

2 回答 2

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 ...

于 2020-05-24T08:42:30.767 回答
0

我遇到了类似的问题,我通过将我的 rq 版本从 1.4.1 降级到 1.3.0 来修复它。

于 2020-05-24T08:04:00.243 回答