我编写了一些代码,需要很长时间才能执行(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网页(http://python-rq.org/docs/workers/)上,所描述的启动工作人员的方法是执行
$ rqworker从贝壳里。但是这个工作程序不是作为守护进程启动的,因此当我连接到这个远程服务器时,我的应用程序是在ssh上安装的,如果我的ssh连接中断了,那么这个工作程序也会中断,这也不是我想要的行为。在我的代码执行时,将ssh连接维护2-3天,除了在我的示例中使用python之外,它拒绝整个逻辑。有什么办法解决这个问题吗?也许应该启动python工作人员,而不是从要去守护的shell启动?
发布于 2014-05-04 21:32:54
您可以在后台(&)运行工作人员,并将输出发送到文本文件(nohup):
nohup rqworker &Bydefault会将输出写入同一目录下的文件nohup.out (如果不允许,则写入$HOME/nohup.out )。现在可以关闭ssh连接。
在默认设置下,rq会为该文件编写大量内容,但是--quiet会帮助:
nohup rqworker --quiet &见男子汉和如何在后台开始作业。
发布于 2016-05-04 13:36:53
您可以为此使用监督d包。它有助于设置一个deamon进程,以便在后台运行任务。而且它也很容易配置。
https://stackoverflow.com/questions/23461659
复制相似问题