python - 使用 python-rq 在远程服务器上执行长任务

标签 python redis flask python-rq

我写了一些需要很长时间才能执行(2-3 天)的代码,我想将它推送到服务器上执行。该代码包含丰富的类和函数,它们相互交互,但最终整个代码执行是通过单个函数 (test2) 完成的,这将使它正常工作。我发现适合我的解决方案可能是任务队列,因为我不需要同时执行多个任务,所以我发现 RQ 可能适合我的需要。

#action_test.py

import action2

def test1():
    fl = action2.FollowersList()
    mech = action2.Mechanics()
    manager = action2.Manager()
    manager.launch(mech,fl)
    for i in range(0,10):
        manager.iterate(mech,fl)

def test2():
    messageList = []
    fl = action2.FollowersList()
    mech = action2.Mechanics()
    manager = action2.Manager()
    manager.launch(mech,fl)
    for i in range(0,2000):
        message = manager.iterate(mech,fl)
        messageList.append(message)
    return messageList

我已经在远程服务器上设置了 Reddis。以守护进程模式运行它。比起我写了一个简单的模块,它应该只是把我的 test2 函数放在一个队列中。

#app.py

from rq import Connection, Queue
from redis import Redis
from action_test import test2

def main():
    # Tell RQ what Redis connection to use
    redis_conn = Redis()
    q = Queue(connection=redis_conn)  # no args implies the default queue

    # Delay calculation of the multiplication
    job = q.enqueue(test2, timeout = 259200)
    print job.result   # => None

if __name__ == '__main__':
    main()

然后我遇到了一个问题:在 python-rq 文档网页(http://python-rq.org/docs/workers/)上,描述的启动工作人员的方法是执行

$ rqworker

来自外壳。但是这个工作人员不是作为守护进程启动的,因此当我连接到这个远程服务器时,我的应用程序是通过 ssh 设置的,如果我的 ssh 连接断开,工作人员也会出现故障,这不是我想要的行为具有。在我的代码执行时保持 ssh 连接 2-3 天拒绝在我的情况下使用 python-rq 之外的整个逻辑。有什么办法可以解决这个问题吗?也许一个 python-rq worker 不应该从 shell 启动以被守护?

最佳答案

您可以在后台运行 worker (&) 并将输出发送到文本文件 (nohup):

nohup rqworker &

默认情况下,这会将输出写入同一目录中的文件 nohup.out(如果不允许,则写入 $HOME/nohup.out)。您现在可以关闭 ssh 连接。

在默认设置下,rq 会向这个文件写入很多内容,但是 --quiet 有帮助:

nohup rqworker --quiet &

参见 man nohuphow to start jobs in background .

关于python - 使用 python-rq 在远程服务器上执行长任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23461659/

相关文章:

python - 使用 serializers.serialize() 函数序列化 Django 模型查询集

python - 如何使用 python 从 pdf 文件中使用 camelot 提取表名和表?

linux - 短读或 OOM 加载数据库。不可恢复的错误,现在中止

clojure - 使用 taoensso.carmine 检查是否存在多个 key

ruby-on-rails - 带有 Rubber gem 的 EC2 - Redis/Resque FileUtils 权限问题

python - 从 Flask 中的登录表单安全地发送密码

python - Pandas groupby nunique 输出到列表

python - 如何区分对同一个 Flask webhook 的两次不同调用?

javascript - 如何使 javascript 在 Flask 上与 python 一起工作?

python - Django 找不到对象时会返回什么?