Python 使用RQ工作者、队列和作业时,管理路径的正确方法是什么
我的第一个问题/帖子。。。请善待 我正在从事一个个人项目,其中一个模块在循环中运行,收集数据。当数据进入时,它将数据插入数据库的操作交给队列中的一个函数,在队列中,侦听rq工作人员拾取数据并处理该函数。数据库使用SQLAlchemy进行管理,这意味着它必须生成引擎、会话并定义数据库表 代码文件的结构是:Python 使用RQ工作者、队列和作业时,管理路径的正确方法是什么,python,sqlalchemy,task-queue,python-rq,Python,Sqlalchemy,Task Queue,Python Rq,我的第一个问题/帖子。。。请善待 我正在从事一个个人项目,其中一个模块在循环中运行,收集数据。当数据进入时,它将数据插入数据库的操作交给队列中的一个函数,在队列中,侦听rq工作人员拾取数据并处理该函数。数据库使用SQLAlchemy进行管理,这意味着它必须生成引擎、会话并定义数据库表 代码文件的结构是: --/home/..../collect-view/ (this is the project folder) -- DataCollection -- main_cl
--/home/..../collect-view/ (this is the project folder)
-- DataCollection
-- main_client.py (main loop waiting for user data)
-- collect_data.py (contains the database insertion function)
-- base.py (the base file for SQLAlchemy database definition)
-- tables.py (the file which sets up the table name and definition)
-- app.db (the database file)
注意:数据库文件位于更高级别的目录中,因为它也被另一个同样位于该级别的应用程序(Flask app)访问
要实现这段代码,“collect_data”必须导入“base”,而“tables”和“tables”必须导入“base”。这被证明是一个问题,因为一旦collect_data函数(称为“transfer”)由worker运行,它就再也找不到要导入的文件,worker抛出一个异常,说它无法导入“base”。我在网上搜索答案,最终在Github上从nvie找到了答案,其中提到使用--path选项将工作人员引导到正确的路径。我通过实施以下措施使其发挥作用:
$ rq worker rq_worker_data2db --path /home/../../collect_view/DataCollection
然后,我遇到了另一个与路径相关的故障,工作人员说它找不到我试图插入数据的数据库表。所以我改变了引擎创建步骤,也包括了我的完整路径
base_url = '/home/.../collect_view/'
engine = create_engine ('sqlite:///' + base_url + 'app.db')
这个问题让我更加困惑,因为我的工作人员已经在我的数据收集目录中工作了,所以我认为:sqlite:///../app.db“)将是定位数据库的正确方法(就像在没有rq工作者的情况下进行测试时一样)
所以,经过长时间的解释,我的问题是:在这种情况下,管理路径的正确方法是什么?在我看来,我必须使用我从/回家的完整路径是错误的。。。我是否遗漏了一些关于路径和/或rq worker(以及类似的)如何工作的信息
我的代码文件摘录如下:
main_client.py
收集_data.py
base.py
tables.py
在终端中,我首先让Redis运行,然后使用以下命令运行worker:
$rq-worker-rq\u-worker\u-data2db--path/home/./../collect\u-view/DataCollection
(其中rq_worker_data2db是工作者名称)@snakecharmerb。关于rq工作程序的工作目录,您是正确的。我从完整路径更改为“./DataCollection”(我在“collect\u view”文件夹中启动rq worker),代码的工作原理与使用完整路径时相同。到目前为止还不错。但是,sqlalchemy引擎定义中使用的sqlite数据库的位置仍然是一个问题。在base.py中使用“os.getcwd()”表明base.py是在cwd='home/../collect\u view'(DataCollection的父目录)的情况下运行的???
from redis import Redis
import rq
from collect_data import transfer
redis_url = Redis.from_url('redis://') #(config['REDIS_URL'])
queue = rq.Queue('rq_worker-data2db', connection=redis_url)
#.....
#.....
def have_data(data):
rq_job = queue.enqueue('collect_data.transfer', data)
#.....
#.....
from base import Session, engine, Base
from tables import FieldData
import time
from datetime import datetime
def transfer(info):
timestamp_in = datetime.utcnow()
session = Session()
data1 = FieldData(data=info, timestamp=timestamp_in)
session.add(data1)
session.commit()
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
base_url = '/home/.../collect_view/'
engine = create_engine ('sqlite:///' + base_url + 'app.db')
Session = sessionmaker(bind=engine)
Base = declarative_base()
from sqlalchemy import Column, String, Float, Integer, Date, DateTime, Table, ForeignKey
from base import Base
from datetime import datetime
# .....
#.....
class FieldData(Base):
__tablename__ = 'field_data'
id = Column(Integer, primary_key=True)
data = Column(String(20))
timestamp = Column(DateTime, index=True, default=datetime.utcnow)
def __init__(self, data, timestamp):
self.data = data
self.timestamp = timestamp