在这种情况下,Python/Django是否适合使用多处理或线程?

在这种情况下,Python/Django是否适合使用多处理或线程?,python,django,Python,Django,我在Django中有这样一个函数: def uploaded_files(request): global source global password global destination username = request.user.username log_id = request.user.id b = File.objects.filter(users_id=log_id, flag='F') # Get the u

我在Django中有这样一个函数:

def uploaded_files(request):
    global source
    global password
    global destination
    username = request.user.username

        log_id = request.user.id
        b = File.objects.filter(users_id=log_id, flag='F')  # Get the user id from session .delete() to use delete
        source = 'sachet.adhikari@69.43.202.97:/home/sachet/my_files'
        password = 'password'
        destination = '/home/zurelsoft/my_files/'
        a = Host.objects.all() #Lists hosts
        command = subprocess.Popen(['sshpass', '-p', password, 'rsync', '--recursive', source],
                               stdout=subprocess.PIPE)
        command = command.communicate()[0]
        lines = (x.strip() for x in command.split('\n'))
        remote = [x.split(None, 4)[-1] for x in lines if x]
        base_name = [os.path.basename(ok) for ok in remote]
        files_in_server = base_name[1:]
        total_files = len(files_in_server)
        info = subprocess.Popen(['sshpass', '-p', password, 'rsync', source, '--dry-run'],
                               stdout=subprocess.PIPE)
        information = info.communicate()[0] 
        command = information.split()
        filesize = command[1] 
        #st = int(os.path.getsize(filesize))
        #filesize = size(filesize, system=alternative)
        date = command[2] 
        users_b = User.objects.all()
        return render_to_response('uploaded_files.html', {'files': b, 'username':username, 'host':a, 'files_server':files_in_server, 'file_size':filesize, 'date':date, 'total_files':total_files, 'list_users':users_b}, context_instance=RequestContext(request))  

该功能的主要用途是将文件从服务器传输到本地计算机,并将数据写入数据库。我想要的是:有一个10GB的文件需要很长时间才能复制。由于复制是在命令行中使用rsync进行的,所以我想让用户在传输文件时播放其他菜单。我怎样才能做到这一点?例如,如果用户按OK,文件将在命令行中传输,因此我想向用户显示“文件正在传输”消息并停止滚动光标或类似的操作?在这种情况下,多处理或线程处理是否合适?谢谢

假设该功能在视图中工作,您的浏览器将在10GB文件完成传输之前超时。也许你应该重新考虑一下你的架构

可能有几种方法可以做到这一点,但我现在想到的是:

一种解决方案是让一个中介存储文件传输的状态。在开始传输文件的过程之前,请在数据库之类的地方设置一个标志,表明该过程已开始。然后,如果进行子流程调用阻塞,请等待它完成,如果可能,请检查命令的输出,并更新先前设置的标志

然后让前端轮询文件传输的状态

另一种解决方案是,如果您像示例中那样使子流程调用非阻塞,那么在这种情况下,您应该使用一个线程,该线程位于那里,读取标准输出并更新一个中间存储,前端可以查询该存储,以获得传输流程的更“实时”更新

你需要的是


它允许您将作业作为并行任务生成,并返回http响应。

RaviU解决方案肯定会起作用

另一个选项是在自己的线程中调用阻塞子进程。这个线程可以负责设置一个标志或信息(在memcache、db或硬盘上的一个文件中),并在完成时清除它。就我个人而言,阅读rsyncsstdout和我之间没有什么不喜欢的地方,所以我通常只要求操作系统提供文件大小

此外,如果您不需要文件绝对尽快,添加“-c”进行校验和可能对那些巨大的文件有好处。资料来源:试图通过杂乱无章的校园网传输巨大视频文件的个人经历


我要说,到目前为止,所有解决方案的一个问题是,它不适用于“N”文件。最终,即使你确保每个文件一次只能传输一次,如果你有很多不同的文件,那么最终会使系统陷入困境。您最好使用某种任务队列,除非您知道它一次只能是一个文件。我最近没用过,但谷歌的快速搜索结果不错。

每台网络服务器都有上传文件的功能。它对大文件的作用是将文件分成块,并在接收到每个块后进行合并。这里您可以做的是,您可以在html页面中有一个隐藏的标记,该标记具有value属性,并且每当上载Web服务在该时间点向您返回ok消息时,您可以将隐藏的html值更改为相关的值,还可以编写一个函数,不断读取隐藏的html元素的值,并检查您的文件上载是否已完成

以前有人告诉过你应该在这里使用全局变量。如果两个用户想同时上传文件怎么办?您将获取错误的用户数据。抱歉,这应该是“您不应该使用全局变量”。是的,所以我应该将变量作为参数传递,对吗?