0

Djangoセロリで次のようなタスクがあります:

@task
def file(password, source12, destination):
    subprocess.Popen(['sshpass', '-p', password, 'rsync', '-avz', '--info=progress2', source12, destination], 
                                    stderr=subprocess.PIPE, stdout=subprocess.PIPE).communicate()[0]

上記のタスクを実行する関数があります。

@celery.task
@login_required(login_url='/login_backend/') 
def sync(request):
    #user_id = request.session['user_id']
    """Sync the files into the server with the progress bar"""
    if request.method == 'POST':
        choices = request.POST.getlist('choice') 
        for i in choices:
            new_source = source +"/"+ i 
            #b = result.successful()
            #result.get() #Poll the database to get the progress
            start_date1 = datetime.datetime.utcnow().replace(tzinfo=utc)
            source12 = new_source.replace(' ', '') #Remove whitespaces
            file.delay(password, source12, destination)
        return HttpResponseRedirect('/uploaded_files/')
    else:
        return HttpResponseRedirect('/uploaded_files/')

進行状況とともにファイル転送情報をユーザーに表示したいfile name, remaining time and size of the file.転送されていることを表示したい. どうやってやるの?

4

1 に答える 1

0

ここに、セロリ自体を介して情報を渡す方法の例があります。アップロード プロセスを AJAX 呼び出しとして開始し、タスクの ID を返し、後で AJAX によってタスクの状態を確認するだけです。

file実際にどのように作業しているかを知るには、タスク自体の進行状況を知る必要があります。サブプロセスを他の方法で呼び出して出力sshpassを解析することでそれを達成できるかどうかは疑問です。PIPE

セロリは.delay、タスクを実行するときにすでにプロセスを生成していることに注意してください。

宛先をチャンクで読み取り、チャンクを再同期してから、ファイルを宛先にマージしてみてください。そうすれば、すでに転送したチャンクの数がわかります。

于 2013-02-05T09:36:22.570 に答える