我已经编写了一些需要很长时间才能执行(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 之外的整个逻辑。有没有办法解决这个问题?也许不应该从 shell 启动一个 python-rq worker 来进行守护进程?