0

実行に時間がかかるコード (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 ドキュメント Web ページ ( http://python-rq.org/docs/workers/ ) で、説明されているワーカーを起動する方法は実行することです

$ rqworker

シェルから。しかし、このワーカーはデーモンとして起動しないため、アプリが ssh 経由でセットアップされているこのリモート サーバーに接続しているときに、ssh 接続がダウンするとワーカーもダウンし、これは私が望む動作ではありません。持つため。コードの実行中に 2 ~ 3 日間 ssh 接続を維持すると、私の場合は python-rq を使用する以外のロジック全体が拒否されます。この問題を回避する方法はありますか? おそらく、デーモン化するシェルからではなく、python-rq ワーカーを起動する必要がありますか?

4

3 に答える 3

1

私が知る限り、あなたはまったく必要ありませんpython-rq。メッセージ キューは通常、分散システムでの通信に使用されます。これは、リモート サーバーで実行時間の長いスクリプトを実行したいだけの人にとってはやり過ぎです。をスキップしてrqworker、スクリプトを直接実行できます。スクリプトに追加if __name__=='__main__': test2()するとaction_test.py、コマンドラインからスクリプトを実行できます。

python test_action.py

ご指摘のとおり、SSH セッションを閉じると、スクリプトも強制終了されます。これは、「シグナル」と呼ばれる Unix/Linux の魔法によるものです。システムは、ジョブに「ハングアップ」シグナルを送信しますSIGHUP。マーティンはnohupすでに述べており、それは実行可能な答えです(例nohup python test_action.py)が、長いスクリプトを実行したいだけの初心者にとっては少し複雑です。

より簡単な解決策は、 を使用することscreenです。Screen は、シェルから切断して後で再接続できる仮想端末を作成します。screen がインストールされている場合は、実行するだけでscreen新しい仮想端末が作成されます。通常どおりプログラムを実行しますpython test_action.py。起動したら、 と入力Ctrl+ADてから切断します。これで SSH セッションを切断できますが、ジョブは何も起こらなかったかのように仮想端末で実行され続けます。後で、サーバーに SSH で戻り、入力screen -rしてその端末の使用を再開できます。

詳細はこちら: https://unix.stackexchange.com/questions/24658/nohup-vs-screen

于 2015-08-30T15:16:57.403 に答える
0

これには、 supervisordパッケージを使用できます。バックグラウンドでタスクを実行するためのデーモン プロセスをセットアップするのに役立ちます。また、構成も非常に簡単です。

于 2016-05-04T13:36:53.897 に答える