Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何避免同时访问多个文件(文件互斥)?;_Python_Linux_Multithreading_Flask_Server - Fatal编程技术网

Python 如何避免同时访问多个文件(文件互斥)?;

Python 如何避免同时访问多个文件(文件互斥)?;,python,linux,multithreading,flask,server,Python,Linux,Multithreading,Flask,Server,我目前正在使用python开发一个数据处理web服务器(linux) 一般工作流程为: 从用户处获取输入文件(由python flask处理) Flask将此输入文件传递给java程序 Java程序处理这个输入文件,将输出(多个文件)保存在服务器上 Flask调用另一个python脚本,该脚本将处理这些输出以获得最终结果并将结果返回给客户端 问题是:在第3步和第4步之间,存在一些中间文件,如果这是一个本地程序,这根本不是问题。但作为一个服务器程序,当多个客户端访问该程序时,它们可能会得到由同时使

我目前正在使用python开发一个数据处理web服务器(linux)

一般工作流程为:

  • 从用户处获取输入文件(由python flask处理)
  • Flask将此输入文件传递给java程序
  • Java程序处理这个输入文件,将输出(多个文件)保存在服务器上
  • Flask调用另一个python脚本,该脚本将处理这些输出以获得最终结果并将结果返回给客户端
  • 问题是:在第3步和第4步之间,存在一些中间文件,如果这是一个本地程序,这根本不是问题。但作为一个服务器程序,当多个客户端访问该程序时,它们可能会得到由同时使用该web程序的另一用户提供的输入生成的意外结果

    在我看来,这是一种文件访问的互斥问题。我以前在线程上遇到过互斥问题,我使用线程锁解决了其中一些问题,比如java中的同步和Python中的锁,但我不确定当涉及到文件而不是线程时该怎么办

    我突然想到,也许我可以根据不同的客户端生成不同的文件副本。但据我所知,HTTP是无状态的,因此您无法真正知道谁在访问服务器。我不想添加一个登录系统和一个用户数据库来达到这个目的,因为我觉得有一个更简单更好的方法来解决这个问题


    这些天我一直在寻找一个好的解决方案,但还没有找到一个理想的解决方案,所以我在这里寻求一些建议。如有任何建议,将不胜感激。如果您能建议一个可行的解决方案,请随时向我提供您的姓名,以便我可以在该工具发布时将您添加到有关该工具的数字和纸质出版物的感谢列表中。

    作为一个系统类型的人,我建议您这样做

    这就是我将如何解决这个问题有很多方法可以解决这个问题,这取决于辩论,当然,最好的解决方案很难实现

    假设输出文件是发生冲突的地方

    因此,您锁定文件并一直轮询,直到资源释放(用户需要等待),因此您强制一个用户一次访问该文件(polling here time.sleep)大约2-3秒(添加一个try except),只有在资源释放时,才对输出文件执行线程锁定下一个用户进程将正常通过


    另一种简单的方法是将数据转储到rds(如mysql或postgres)中,它将处理并发请求中发生的所有文件访问噩梦(将输出文件放入数据库)。

    一种可能的解决方案是为临时文件生成随机名称(考虑UUID),然后在正在运行的程序之间传递这些名称。甚至是一个随机命名的目录。另一种可能是在处理完文件后删除它们并进行检查-如果文件存在,请等到它不存在。感谢这个想法,我实际上已经决定采用这种方式,以便多个用户可以同时访问该程序。嗨,哈穆尔,谢谢你的友好回答。事实上,如果我真的找不到更好的方法,锁定文件一直是我的备份解决方案。我之所以苦苦挣扎,是因为如果输入文件很大,文件处理可能需要一段时间。关于数据库,我如何在需要时检索这些文件?正如我所描述的,HTTP协议是无状态的,因此您不知道哪些数据属于哪个用户。无状态并不意味着您不能在请求的上下文中拥有唯一的令牌或UUID。您可以在程序运行时跟踪它,然后丢弃它。