我写了一些需要很长时间才能执行(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 &
关于python - 使用 python-rq 在远程服务器上执行长任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23461659/